我创建了JWindow
,它有几个JTextInput
字段。这位JWindow
家长是JFrame
。现在的情况 - 如果单击文本字段 - 他们获得焦点但JWindow
也保持焦点。那很好。但是,如果我创建另一个JWindow
( first 的子级JWindow
)并将其设置为可见,则焦点在 firstJWindow
上会丢失,而子级JWindow
会被聚焦。这是不好的。有什么方法可以保持对父母的关注JWindow
,让孩子JWindow
像JTextInput
领域一样获得关注?
问问题
725 次
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 回答