0
4 개의 탭이있는 JTabbedPane이 있습니다. 각 탭에는 JTable가 있습니다. JTabbedPane에 대한 커스텀 FocusTraversalPolicy를 디자인하려고합니다. 테이블의 마지막 셀에 집중할 때 탭을 누르면 다음 탭으로 이동합니다. 나는 많은 것을 수색했으나 내가 할 수있는 구체적인 것을 발견하지 못했다.JTabbedPane FocusTraversalPolicy
tabbedPane.setFocusCycleRoot(true);
tabbedPane.setFocusTraversalPolicyProvider(true);
tabbedPane.setFocusTraversalPolicy(new MyPanelFocusTraversalPolicy(tabbedTables));
다음은 내 포커스 포커스 통과 정책입니다.
private class MyPanelFocusTraversalPolicy extends FocusTraversalPolicy{
private Vector<Component> order;
public StateWithholdingPanelFocusTraversalPolicy(List<CopyWorkerSingleTablePanel> table){
this.order = new Vector<Component>(table.size());
this.order.addAll(table);
}
@Override
public Component getComponentAfter(Container aContainer, Component aComponent) {
return order.get(order.indexOf(aComponent)+1);
}
@Override
public Component getComponentBefore(Container aContainer, Component aComponent) {
return order.get(order.indexOf(aComponent)-1);
}
@Override
public Component getFirstComponent(Container aContainer) {
return order.get(1);
}
@Override
public Component getLastComponent(Container aContainer) {
return order.lastElement();
}
@Override
public Component getDefaultComponent(Container aContainer) {
return order.get(0);
}
}
또한, 이러한 JTables 다른 곳에서 인스턴스화되고 난 때 마지막 셀에 다음 구성 요소에 초점을 바인딩 Tab 키를 무시했다. 나는 다른 화면에서도 유용하게 사용할 수 있도록 만들었습니다.
KeyStroke keyStroke = KeyStroke.getKeyStroke("TAB");
Object actionKey = copyWorkerTable.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).get(keyStroke);
final Action action= table.getActionMap().get(actionKey);
Action wrapper = new AbstractAction() {
@Override
public void actionPerformed(ActionEvent e) {
if(table.getSelectedRow() >= table.getRowCount()-1 && table.getSelectedColumn() >= table.getColumnCount()-1) {
if(!table.isCellEditable(table.getSelectedRow(),table.getSelectedColumn())){
table.transferFocus();
}else{
table.getCellEditor(table.getSelectedRow(),table.getSelectedColumn()).stopCellEditing();
table.transferFocus();
}
}else{
action.actionPerformed(e);
}
}
};