タブを変更する場合、JTabbedPaneは常にタブ内の最初のフォーカス可能なコンポーネントにフォーカスします。最後にフォーカスされたコンポーネントにフォーカスするか、まったくフォーカスしないように、その動作を変更するにはどうすればよいですか?JTabbedPaneが間違ったフィールドにフォーカスを設定してはならないため、後でrequestFocusを呼び出すことはできません。
4888 次
2 に答える
4
見てみましょう:最後に焦点を合わせたコンポーネントを思い出します。
各タブでフォーカスがあるコンポーネントを追跡する必要があります。次に、タブが選択されたら、フォーカスを適切なコンポーネントに変更する必要があります。上記のリンクから取得したコードは次のとおりです。
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();
}
}
}
于 2011-07-19T13:51:23.060 に答える
2
基本的に、これは1つのトップレベルコンテナ内で正しく機能します
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
someComponent.grabFocus();
someComponent.requestFocus();//or inWindow
}
});
于 2011-07-19T13:23:14.470 に答える