有一种想法是在windowOpened事件触发时添加一个窗口监听器并设置焦点:
addWindowListener(new WindowAdapter(){
public void windowOpened( WindowEvent e){
txtMessage.requestFocus();
}
});
另一种思想流派说使用SwingUtilities.invokeLater方法将焦点设置在一个单独的线程中。
SwingUtilities.invokeLater(new Runnable()
{
public void run() {
field.requestFocus();
}
});
有人能告诉我哪种是最佳做法,或者何时选择其中一种? 使用线程解决方案时,线程是否可能丢失并且焦点永远不会设置?
答案 0 :(得分:4)
必须在事件 - 调度线程(EDT)上完成对GUI的所有更新。如果您不确定自己是否使用它,invokeLater(...)将始终保证它。如果您使用它并且不需要它,它不会伤害任何东西。
此外,您应该使用field.requestFocusInWindow();
答案 1 :(得分:3)
addWindowListener(new WindowAdapter(){
public void windowOpened( WindowEvent e){
SwingUtilities.invokeLater(new Runnable()
{
public void run() {
field.requestFocusInWindow();
}
});
}
});
答案 2 :(得分:2)
最佳做法是使用requestFocusInWindow()
而不是requestFocus()。
我更喜欢第二种方法。我认为它适用于所有情况。
面板应独立于它们将被添加到的Window(JFrame或JDialog)创建,以便面板在构造时不会引用Window。例如:
JPanel panel = new CustomPanel();
JFrame frame = new JFrame();
frame.add( panel );
对于第三种方法,您可以查看RequestFocusListener。