2010-02-09 3 views
1

테이블을 쉽게 편집하려고합니다. 정보를 표시하는 데 사용자 정의 구성 요소를 사용합니다. 각 셀에는 3 개의 데이터 텍스트가 있습니다.셀 편집기의 구성 요소 내에서 포커스 이동

는 내가 원하는 것은 : 셀에 포커스를 취득

  • 경우, 1 값을 편집을 시작합니다.
  • 첫 번째 값을 편집하는 동안 [Tab]을 누른 다음 두 번째 값을 편집하십시오 (다음 셀로 이동하지 마십시오)
  • [Tab]을 세 번째 값으로 누른 후 다음 값을 편집하면 세포 아직 ...이 경우,이 문제를 찾을 수

내가 WASS 포럼의 I 않았나을보고합니다 (1SR 값을 입력) 스윙 귀하의 답변에 미리

감사 내용을 읽고,이입니다 내 코드 :

public class PruebaTabla extends JFrame { 

    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable(){ 

      public void run() { 
       new PruebaTabla().setVisible(true); 
      }}); 
    } 
    public PruebaTabla(){ 

     JTable tabla = new JTable(); 

     tabla.setSelectionMode(ListSelectionModel.SINGLE_SELECTION); 
     tabla.setCellSelectionEnabled(true); 
     tabla.setDefaultRenderer(ModelClass.class, new ModelClassCellRederer()); 
     tabla.setDefaultEditor(ModelClass.class, new ModelClasstroCellEditor()); 
     tabla.setRowHeight(30); 

     CustomModel model = new CustomModel(); 
     model.setModel(new ModelClass[][]{ 
             {new ModelClass(), new ModelClass(), new ModelClass()}, 
             {new ModelClass(), new ModelClass(), new ModelClass()}, 
             {new ModelClass(), new ModelClass(), new ModelClass()}}); 
     tabla.setModel(model); 


     getContentPane().add(new JScrollPane(tabla)); 
     setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
     setSize(480,150); 
     setLocationRelativeTo(null); 

    } 

    private class ModelClass { 

     private String value1; 
     private String value2; 
     private String value3; 
     public ModelClass(){ 
      setValue1("" + Math.round(Math.random() * 100)); 
      setValue2("" + Math.round(Math.random() * 100)); 
      setValue3("" + Math.round(Math.random() * 100)); 
     } 
     public String getValue1() { 
      return value1; 
     } 
     public void setValue1(String value1) { 
      this.value1 = value1; 
     } 
     public String getValue2() { 
      return value2; 
     } 
     public void setValue2(String value2) { 
      this.value2 = value2; 
     } 
     public String getValue3() { 
      return value3; 
     } 
     public void setValue3(String value3) { 
      this.value3 = value3; 
     } 

    } 

    private class CustomModel extends AbstractTableModel{ 

     ModelClass[][] model; 
     String[] columnNames = new String[] {"Column1", "Column2", "Column3"}; 

     @Override 
     public Class<?> getColumnClass(int columnIndex) { 
      return ModelClass.class; 
     } 

     @Override 
     public String getColumnName(int column) { 
      return columnNames[column]; 
     } 
     public int getColumnCount() {  
      return 3; 
     } 

     public int getRowCount() { 
      return 3; 
     } 

     public Object getValueAt(int rowIndex, int columnIndex) {   
      return model[rowIndex][columnIndex]; 
     } 

     public ModelClass[][] getModel() { 
      return model; 
     } 

     public void setModel(ModelClass[][] model) { 
      this.model = model; 
     } 

     @Override 
     public boolean isCellEditable(int rowIndex, int columnIndex) {   
      return true; 
     } 
    } 

    private class ModelClassCellRederer implements TableCellRenderer { 

     JPanel panel = new JPanel(); 
     private JLabel label1= new JLabel(); 
     private JLabel label2 = new JLabel(); 
     private JLabel label3 = new JLabel(); 

     ModelClassCellRederer(){ 
      panel.add(label1); 
      panel.add(label2); 
      panel.add(label3); 
     } 

     public Component getTableCellRendererComponent(JTable table, 
       Object value, boolean isSelected, boolean hasFocus, int row, 
       int column) { 

      if (isSelected) { 
       panel.setBackground(table.getSelectionBackground()); 
       panel.setBorder(UIManager.getBorder("Table.focusCellHighlightBorder")); 
      } else { 
       panel.setBackground(table.getBackground()); 
       panel.setBorder(null); 
      } 

      ModelClass v = (ModelClass) value; 
      label1.setText(v.getValue1()); 
      label2.setText(v.getValue2()); 
      label3.setText(v.getValue3()); 

      return panel; 
     } 

    } 

    private class ModelClasstroCellEditor extends DefaultCellEditor { 

     JPanel panel = new JPanel(); 
     private JTextField label1= new JTextField(); 
     private JTextField label2 = new JTextField(); 
     private JTextField label3 = new JTextField(); 
     ModelClass actual; 

     public ModelClasstroCellEditor() { 
      super(new JCheckBox()); 
      panel.add(label1); 
      panel.add(label2); 
      panel.add(label3); 
      setClickCountToStart(1); 
     } 

     @Override 
     public Component getTableCellEditorComponent(JTable table, 
       Object value, boolean isSelected, int row, int column) { 
      actual = (ModelClass) value; 
      label1.setText(actual.getValue1()); 
      label2.setText(actual.getValue2()); 
      label3.setText(actual.getValue3()); 

      return panel; 
     } 

     @Override 
     public Object getCellEditorValue() { 
      if (actual != null){ 
       actual.setValue1(label1.getText()); 
       actual.setValue2(label2.getText()); 
       actual.setValue3(label3.getText()); 
      } 
      return actual; 
     } 

     @Override 
     public boolean isCellEditable(EventObject anEvent) { 
      if (anEvent instanceof KeyEvent) { 
       final KeyEvent keyEvent = (KeyEvent) anEvent; 

       SwingUtilities.invokeLater(new Runnable() { 

        public void run() { 
         if (!Character.isIdentifierIgnorable(keyEvent.getKeyChar())) { 
          label1.setText("" + keyEvent.getKeyChar()); 
         } 
         label1.setCaretPosition(label1.getText().length()); 
         label1.requestFocusInWindow(); 
        } 
       }); 
       } 
       return super.isCellEditable(anEvent); 

     } 

    } 
} 

답변

1

현재 JTable은 UIManager.get("Table.ancestorInputMap")의 InputMap을 사용하여 키보드 입력을 처리합니다. 이것은 현재 탭을 "selectNextColumnCell"문자열로 매핑하여 JTable의 ActionMap에있는 Action으로 매핑하여 사용자를 다음 셀로 이동시킵니다.

는 다음과 같은 작업을 수행 할 수 있습니다

  1. 누구의 actionPerformed 방법 후 당신 순회 정책을 수행 액션을 만듭니다.

  2. ActionMap에서 "someStringThatDescribesYourAction"을 키로 지정하고 Action을 값 1로 지정하십시오.

  3. InputMap에서 키로 KeyStroke.getKeyStroke("TAB")을 넣고 2에서 값으로 String을 입력하십시오. 이것은 당신을 다음 셀로 이동시키는 현재 액션을 대체 할 것입니다.

관련 문제