2010-02-09 5 views
1

J'essaie de modifier facilement une table en utilisant un composant personnalisé pour afficher des informations. Chaque cellule contient 3 textes de données.Traversée de focus dans les composants d'un éditeur de cellules

Ce que je veux est:

  • si une cellule se concentrer, commencer à modifier la valeur 1er.
  • lors de l'édition de la 1ère valeur presse utilisateur [TAB], puis allez éditer la 2ème valeur (ne pas aller à la cellule suivante)
  • si j'appuyez sur [TAB] dans la 3ème valeur, alors, allez éditer la prochaine cellule (saisie de la valeur 1sr)

Je recherche Wass dans les forums un i didnt trouver ce cas, ce problème ... lire encore apprendre swing

Merci d'avance pour vos réponses, c'est mon code:

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); 

     } 

    } 
} 

Répondre

1

Actuellement, votre JTable gère la saisie au clavier à l'aide d'un InputMap de UIManager.get("Table.ancestorInputMap"). Cela a actuellement l'onglet mappé à la chaîne "selectNextColumnCell", qui correspond à une action dans ActionMap de JTable qui vous déplace vers la cellule suivante.

Vous pouvez effectuer les opérations suivantes:

  1. Créer une action dont la méthode actionPerformed La politique traversal que vous êtes après.

  2. Dans ActionMap, placez "someStringThatDescribesYourAction" comme clé et votre action de 1 comme valeur.

  3. Dans InputMap, placez KeyStroke.getKeyStroke("TAB") comme clé et la chaîne de 2 comme valeur. Cela remplacera l'Action en cours qui vous amène à la cellule suivante.

Questions connexes