2011-07-19 32 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