让孩子们聚焦时,JWindow会保持专注,包括另一个孩子的窗口

时间:2013-08-16 20:32:42

标签: java swing focus jwindow

我创建了JWindow,其中包含多个JTextInput字段。这个JWindow父级是JFrame。现在的情况 - 如果单击文本字段 - 它们会得到焦点,但JWindow也会保持专注。那很好。但是,如果我创建了另一个JWindow(第一个JWindow的孩子),并将其设置为可见,则首先关注第一个JWindow,并关注孩子JWindow。这是不好的。是否有某种方法可以将注意力集中在父JWindow上,并让孩子JWindow获得焦点JTextInput字段?

2 个答案:

答案 0 :(得分: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();
            }
        });
    }
}

答案 1 :(得分:2)

在设置子窗口可见之前,请添加WindowListener。在子窗口上调用setVisible后,您将收到windowActivated回调。此时,在父窗口上调用toFront以使其前进。鉴于OS z-order处理的怪癖,您可能需要/想要首先在子窗口上调用toBack,以及在父窗口上调用requestFocus或之后调用其中一个可聚焦的子节点。 / p>