2011-07-19 34 views
1

更改選項卡時,JTabbedPane始終將第一個可聚焦組件聚焦在選項卡內。 我該如何改變它的行爲,以便它可以聚焦最後聚焦的組件,或者根本不聚焦? 之後調用requestFocus不是一個選項,因爲JTabbedPane不能將焦點設置在錯誤的字段中。JTabbedPane - 在選項卡更改後聚焦最後聚焦的組件

回答

3

看看:Remembering last focused component

您需要跟蹤每個選項卡中哪個組件具有焦點。然後,當選擇一個選項卡時,您需要將焦點更改爲適當的組件。

class TabbedPaneFocus extends JTabbedPane implements ChangeListener, PropertyChangeListener { 

    private Hashtable tabFocus; 

    public TabbedPaneFocus() { 
     tabFocus = new Hashtable(); 
     addChangeListener(this); 
     KeyboardFocusManager.getCurrentKeyboardFocusManager().addPropertyChangeListener(this); 
    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see java.beans.PropertyChangeListener#propertyChange(java.beans.PropertyChangeEvent) 
    */ 
    @Override 
    public void propertyChange(PropertyChangeEvent e) { 
     if ("permanentFocusOwner".equals(e.getPropertyName())) { 
      final Object value = e.getNewValue(); 
      if (value != null) { 
       tabFocus.put(getTitleAt(getSelectedIndex()), value); 
      } 
     } 

    } 

    /* 
    * (non-Javadoc) 
    * 
    * @see javax.swing.event.ChangeListener#stateChanged(javax.swing.event.ChangeEvent) 
    */ 
    @Override 
    public void stateChanged(ChangeEvent e) { 
     Object value = tabFocus.get(getTitleAt(getSelectedIndex())); 
     if (value != null) { 
      ((Component) value).requestFocusInWindow(); 
     } 
    } 
} 
+0

工作正常,謝謝! – Markus

+0

你是對的,@camickr關於那個評論... +1 – mKorbel

2

基本上這裏面工作的一個Top-Level Container正確

EventQueue.invokeLater(new Runnable() { 

    @Override 
    public void run() { 
     someComponent.grabFocus(); 
     someComponent.requestFocus();//or inWindow 
    } 
}); 
+0

這是如何防止JTabbedPane中從第​​一個字段設置焦點:這是從上面的鏈接所採取的代碼? – Markus

+0

@Markus這取決於如果第一個領域<>預期的領域,然後是的(我也不能確定什麼組件是領域) – mKorbel