簡體   English   中英

在JPanel中將焦點設置為Swing控件的最佳實踐

[英]Best practice for setting focus to a Swing control in a JPanel

一個想法表明,在windowOpened事件觸發時添加一個窗口偵聽器並設置焦點:

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();

addWindowListener(new WindowAdapter(){ 
  public void windowOpened( WindowEvent e){ 
    SwingUtilities.invokeLater(new Runnable()
    {
      public void run() {
      field.requestFocusInWindow();
      }
    });
  } 
});

最佳實踐是使用requestFocusInWindow()而不是requestFocus()。

我更喜歡第二種方法。 我認為它將在所有情況下都有效。

面板的創建應獨立於將要添加到的窗口(JFrame或JDialog),這樣,在構造窗口時,該面板將不會引用該窗口。 例如:

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

對於第三種方法,您可以簽出RequestFocusListener

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM