0

我创建了JWindow,它有几个JTextInput字段。这位JWindow家长是JFrame。现在的情况 - 如果单击文本字段 - 他们获得焦点但JWindow也保持焦点。那很好。但是,如果我创建另一个JWindow( first 的子级JWindow)并将其设置为可见,则焦点在 firstJWindow上会丢失,而子级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您的父窗口将其向前推进。鉴于操作系统 z 顺序处理的古怪性,您可能需要/想要首先调用toBack子窗口,requestFocus然后再调用父窗口或其可聚焦的子窗口之一。

于 2013-08-16T21:14:23.057 回答