2017-02-09 3 views
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); 
        } 
       } 
      }; 

답변

0

내가 맞으면 왜 탭 사이를 탐색하기 위해 액션 처리기 내부에서 이와 비슷한 것을 사용하지 않는가?

if (tabbedPane.getSelectedIndex() == (tabbedPane.getComponentCount() - 1)) 
    { 

     tabbedPane.setSelectedIndex(0); 

    } else 
    { 

     tabbedPane.setSelectedIndex(tabbedPane.getSelectedIndex() + 1); 

    }