JTabbedPane - фокусировать последний выделенный компонент после смены вкладки - PullRequest
2 голосов
/ 19 июля 2011

При смене вкладок JTabbedPane всегда фокусирует первый фокусируемый компонент внутри вкладки.Как я могу изменить его поведение так, чтобы оно или фокусировало последний сфокусированный компонент, или вообще не фокусировалось?Вызов requestFocus впоследствии не вариант, потому что JTabbedPane вообще не должен устанавливать фокус в неправильном поле.

Ответы [ 2 ]

4 голосов
/ 19 июля 2011

Взгляните на: Запоминание последнего сфокусированного компонента .

Вам необходимо отслеживать, какой компонент имеет фокус на каждой вкладке.Затем, когда вкладка выбрана, вам нужно изменить фокус на соответствующий компонент.Вот код, взятый по ссылке выше:

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();
        }
    }
}
2 голосов
/ 19 июля 2011

в основном это работает внутри одного контейнера верхнего уровня правильно

EventQueue.invokeLater(new Runnable() {

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