Java 在JPanel中设置摆动控件焦点的最佳实践

Java 在JPanel中设置摆动控件焦点的最佳实践,java,swing,focus,Java,Swing,Focus,一个学派认为,在WindowOpen事件触发时添加一个窗口侦听器并设置焦点: addWindowListener(new WindowAdapter(){ public void windowOpened( WindowEvent e){ txtMessage.requestFocus(); } }); 另一个学派说使用SwingUtilities.invokeLater方法在单独的线程中设置焦点 SwingUtilities.invokeLater(new Runnab

一个学派认为,在WindowOpen事件触发时添加一个窗口侦听器并设置焦点:

addWindowListener(new WindowAdapter(){ 
  public void windowOpened( WindowEvent e){ 
    txtMessage.requestFocus();
  } 
});
另一个学派说使用SwingUtilities.invokeLater方法在单独的线程中设置焦点

SwingUtilities.invokeLater(new Runnable()
{
  public void run() {
    field.requestFocus();
  }
});
谁能告诉我哪种是最佳实践,或者什么时候你会选择其中一种?
使用线程解决方案时,线程是否可能丢失且焦点从未设置?

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


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

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


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

最佳做法是使用
requestFocusInWindow()
而不是requestFocus()

我更喜欢第二种方法。我认为它在所有情况下都会起作用

面板的创建应独立于要添加到的窗口(JFrame或JDialog),这样面板在构建时就不会引用窗口。例如:

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

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

最佳做法是使用
requestFocusInWindow()
notrequestfocus()

我更喜欢第二种方法。我认为它在所有情况下都会起作用

面板的创建应独立于要添加到的窗口(JFrame或JDialog),这样面板在构建时就不会引用窗口。例如:

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

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

这并没有回答问题。@nalply This确切地回答问题-它展示了如何更新swing组件的最佳实践,在给定的示例中是如何对组件进行聚焦<代码>字段
您可以替换为任何需要更新的swing组件。不需要使用invokeLater(),因为事件侦听器在EDT上执行。@camickr我认为在大多数情况下,需要使用添加的DocumentListener触发事件来延迟JTextComponents(也用作编辑器组件)的此事件。@mKorbel,是,在某些情况下,但在本例中并非如此。这并不能回答问题。@请准确回答问题-它展示了如何更新swing组件的最佳实践,在给定的示例中,演示了如何对组件进行聚焦<代码>字段
您可以替换为任何需要更新的swing组件。不需要使用invokeLater(),因为事件侦听器在EDT上执行。@camickr我认为在大多数情况下,需要使用添加的DocumentListener触发事件来延迟JTextComponents(也用作编辑器组件)的此事件。@mKorbel,是,在某些情况下,但不是在这种情况下。我们将尝试这种解决方案。谢谢我们将尝试这个解决方案。谢谢