将焦点设置为JPanel中的Swing控件的最佳实践

时间:2013-04-03 19:23:28

标签: java swing focus

有一种想法是在windowOpened事件触发时添加一个窗口监听器并设置焦点:

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

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

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

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

3 个答案:

答案 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