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