0

JWindowいくつかのJTextInputフィールドを持つ を作成しました。このJWindow親はJFrameです。状況 - テキストフィールドがクリックされた場合 - フォーカスを取得しますが、フォーカスJWindowを維持します。それはいいです。しかし、別のJWindow( first の子JWindow) を作成し、それを表示に設定すると、 first へのフォーカスJWindowが失われ、子JWindowがフォーカスされます。これは悪いです。親にフォーカスを保持し、フィールドのようJWindowに子にフォーカスを当てる方法はありますか?JWindowJTextInput

4

2 に答える 2

4

親のない JWindow はフォーカス可能になりません。注意してください。そうすれば、JTextComponents は編集可能になりません。

例えば

import java.awt.*;
import javax.swing.*;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class WindowTest {

    private JFrame frame;
    private boolean bol = true;

    public WindowTest() {
        frame = new JFrame("Window Test");
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(300, 300);
        frame.setVisible(true);
        JWindow win = new JWindow(frame);
        win.setLayout(new GridLayout(0, 1));
        JTextField text = new JTextField("Show Window");
        text.getDocument().addDocumentListener(new DocumentListener() {
            @Override
            public void insertUpdate(DocumentEvent e) {
                if (!bol) {
                    JWindow win = new JWindow();
                    win.setLayout(new GridLayout(0, 1));
                    win.add(new JTextField("JTextField"));
                    win.add(new JTextField("JTextField"));
                    win.add(new JLabel("<html> Concurency Issues in Swing<br>"
                            + " never to use Thread.sleep(int) <br>"
                            + " durring EDT, simple to freeze GUI </html>"));
                    win.pack();
                    win.setLocation(350, 150);
                    win.setVisible(true);
                    bol = true;
                }
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
            }
        });
        win.add(text);
        win.add(new JTextField("JTextField"));
        win.add(new JTextField("JTextField"));
        win.pack();
        win.setLocation(250, 150);
        win.setVisible(true);

        bol = false;
    }

    public static void main(String args[]) {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new WindowTest();
            }
        });
    }
}
于 2013-08-16T21:30:17.183 に答える
2

子ウィンドウを可視に設定する前に、WindowListener. setVisible子ウィンドウを呼び出した後、windowActivatedコールバックを受け取ります。その時点toFrontで、親ウィンドウを呼び出して前面に出します。toBackOS の z オーダー処理の風変わりさを考えると、最初に子ウィンドウを呼び出しrequestFocus、その後で親ウィンドウまたはそのフォーカス可能な子の 1 つを呼び出す必要がある場合があります。

于 2013-08-16T21:14:23.057 に答える