Question

Je souhaite placer des JComboBox individuelles dans chaque cellule d’un JTable. c'est à dire. Le contenu de JComboBox n'est pas identique pour chaque cellule.

En gros, j'aimerais pouvoir appeler le code suivant pour ajouter une ligne de JComboBox à JTable. Quelqu'un a une idée? Merci

JComboBox cb1 = new JComboBox(...);
JComboBox cb2 = new JComboBox(...);
model.addRow(new Object[] {"Row name", cb1, cb2} );

JComboBox cb3 = new JComboBox(...);
JComboBox cb4 = new JComboBox(...);
model.addRow(new Object[] {"Row name 2", cb3, cb4} );

L'exemple de code le plus proche que je puisse trouver est le suivant. Mais c'est pour cela que le contenu de JComboBox est identique pour chaque colonne. Pas la solution dont j'ai besoin.

TableColumn col = table.getColumnModel().getColumn(vColIndex);
col.setCellEditor(new MyComboBoxEditor(values));

public class MyComboBoxEditor extends DefaultCellEditor {
    public MyComboBoxEditor(String[] items) {
        super(new JComboBox(items));
    }
}
Était-ce utile?

La solution

Le moyen le plus simple consiste à implémenter votre propre Modèle de table

public class MyModel extends AbstractTableModel {
    List rows;

    public int getRowCount() {
        return rows.size();
    }

    public int getColumnCount() {
         return 4;
    }

    public Object getValueAt(int row, int column) {
        return rows.get(row).getCol(col);  //assuming your row "Object" has a getCol()
    }

    public Class<?> getColumnClass(int col) {
        return Boolean.class;
    }

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
        rows.get(rowIndex).getCol(columnIndex).setValue(aValue);
    }

}

Chargez ceci dans votre JTable. Si vous n'avez pas remplacé le rendu de cellule par défaut pour Boolean's, toutes vos cellules seront rendues sous forme de cases à cocher, grâce à l'implémentation de getColumnClass (). Toutes les entrées utilisateur dans ces cases à cocher sont collectées avec notre setValueAt ().

Autres conseils

Étendre JTable avec ce code:

@Override
public TableCellEditor getCellEditor(int row, int column) {
   Object value = super.getValueAt(row, column);
   if(value != null) {
      if(value instanceof JComboBox) {
           return new DefaultCellEditor((JComboBox)value);
      }
            return getDefaultEditor(value.getClass());
   }
   return super.getCellEditor(row, column);
}

Ceci créera un éditeur de cellule JComboBox unique pour chaque liste déroulante pour laquelle vous obtenez une valeur.

Je suis sûr que cela résoudra votre problème. Indiquez dans quelle colonne vous devez définir la liste déroulante dans .getColumn (int column)

private void addComboToTable(JComboBox combo) {
    TableColumn gradeColumn = YourTable.getColumnModel().getColumn(0);
    JComboBox comboBox = combo;
    comboBox.removeAllItems();
    try {
        comboBox.addItem("Item 1");
        comboBox.addItem("Item 2");
        comboBox.addItem("Item 3");
    } catch (NullPointerException e) {
    } catch (Exception e) {
        e.printStackTrace();
    }
    gradeColumn.setCellEditor(new DefaultCellEditor(comboBox));
}

Vous devez remplacer:

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

... dans TableCellEditor. La valeur transmise à cette méthode correspond à ce que vous pouvez mettre dans votre JComboBox. Cela signifie que la «valeur» pour cette cellule particulière doit être quelque chose qui peut être traduit en une collection. Il pourrait éventuellement s'agir simplement d'une liste d'objets ou d'un POJO contenant des champs pouvant être transformés en un JComboBox.

Modifiez donc simplement MyComboBoxEditor pour remplacer cette méthode et modifiez votre modèle pour autoriser un objet représentant en réalité plusieurs autres objets.

Le contenu de JComboBox est rendu identique pour chaque sélection de ligne, car JTable n'offre pas la possibilité d'avoir plus d'un éditeur par colonne. Vous devez étendre la classe JTable pour prendre en charge une sélection supplémentaire pour les lignes.

Cet article l'explique très bien: http://www.javaworld.com/javaworld/javatips/jw-javatip102.html

En plus de cellEditor, il est nécessaire que cellRenderer peigne la liste déroulante dans la cellule. Regardez ceci:

 public void example(){  

      TableColumn tmpColum =table.getColumnModel().getColumn(1);
      String[] DATA = { "Data 1", "Data 2", "Data 3", "Data 4" };
      JComboBox comboBox = new JComboBox(DATA);

      DefaultCellEditor defaultCellEditor=new DefaultCellEditor(comboBox);
      tmpColum.setCellEditor(defaultCellEditor);
      tmpColum.setCellRenderer(new CheckBoxCellRenderer(comboBox));
      table.repaint();
   }


/**
   Custom class for adding elements in the JComboBox.
*/
class CheckBoxCellRenderer implements TableCellRenderer {
        JComboBox combo;
        public CheckBoxCellRenderer(JComboBox comboBox) {
            this.combo = new JComboBox();
            for (int i=0; i<comboBox.getItemCount(); i++){
                combo.addItem(comboBox.getItemAt(i));
            }
        }
        public Component getTableCellRendererComponent(JTable jtable, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            combo.setSelectedItem(value);
            return combo;
        }
    }
@Override
public TableCellEditor getCellEditor(int row, int column) {
   Object value = super.getValueAt(row, column);
   if(value != null) {
      if(value instanceof JComboBox) {
           return new DefaultCellEditor((JComboBox)value);
      }
            return getDefaultEditor(value.getClass());
   }
   return super.getCellEditor(row, column);
}

Ensuite, remplacez la méthode toString à partir de JComboBox .

Cette page pourrait vous aider. , bien qu’il semble que vous soyez limité à avoir la même liste déroulante dans toutes les cellules d’une colonne.

Vous devez créer une sous-classe de JTable pour remplacer la méthode TableCellEditor getCellEditor (int row, int column).

Ceci vous permet de définir des éditeurs de cellules arbitraires pour toute combinaison de lignes et de colonnes. La méthode par défaut consiste à définir l'éditeur de cellule pour une colonne entière.

(Vous pouvez également définir des rendus de cellule individuels en remplaçant getCellRenderer.)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top