1

一种思想流派说,当 windowOpened 事件触发时,添加一个窗口侦听器并设置焦点:

addWindowListener(new WindowAdapter(){ 
  public void windowOpened( WindowEvent e){ 
    txtMessage.requestFocus();
  } 
});

另一种思想流派说使用 SwingUtilities.invokeLater 方法在单独的线程中设置焦点。

SwingUtilities.invokeLater(new Runnable()
{
  public void run() {
    field.requestFocus();
  }
});

谁能告诉我哪个是最佳实践,或者您何时会选择其中一个?使用线程解决方案时,线程是否可能会丢失并且永远不会设置焦点?

4

3 回答 3

4

对 GUI 的所有更新都必须在事件调度线程 (EDT) 上完成。如果您不确定自己是否在上面,invokeLater(...) 将始终保证它。如果您使用它并且不需要它,它不会伤害任何东西。

此外,您应该使用field.requestFocusInWindow();

于 2013-04-03T19:43:59.847 回答
3
addWindowListener(new WindowAdapter(){ 
  public void windowOpened( WindowEvent e){ 
    SwingUtilities.invokeLater(new Runnable()
    {
      public void run() {
      field.requestFocusInWindow();
      }
    });
  } 
});
于 2013-04-03T19:50:42.137 回答
2

最佳实践是不使用requestFocusInWindow()requestFocus()。

我更喜欢第二种方法。我认为它适用于所有情况。

面板应该独立于它们将被添加到的窗口(JFrame 或 JDialog)而创建,因此面板在构建时不会引用窗口。例如:

JPanel panel = new CustomPanel();
JFrame frame = new JFrame();
frame.add( panel );

对于第三种方法,您可以查看RequestFocusListener

于 2013-04-04T02:21:03.300 回答