Frage

Ich möchte einzelne JComboBoxes in jeder Zelle eines JTable setzen. dh. Der JComboBox Inhalt ist für jede Zelle nicht identisch.

Ich würde grundsätzlich in der Lage sein möchte nur den folgenden Code zu nennen eine Reihe von JComboBox in die JTable hinzuzufügen. Wer hat eine Idee? Dank

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

Der nächste Beispielcode ich finden kann, ist wie folgt. Aber es ist für wo JComboBox Inhalte für die einzelnen Spalte identisch ist. Nicht die Lösung, die ich brauche.

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

Dabei steht

public class MyComboBoxEditor extends DefaultCellEditor {
    public MyComboBoxEditor(String[] items) {
        super(new JComboBox(items));
    }
}
War es hilfreich?

Lösung

Der einfachste Weg ist Ihre eigenen Tablemodel

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

}

Legen Sie das in Sie JTable. Wenn Sie nicht die Standard CellRenderers für Boolesche die ersetzt haben, alle werden Sie Zellen als Kontrollkästchen dank Ihnen Implementierung von getColumnClass gemacht werden (). Alle Benutzereingaben an dieses Kontrollkästchen ist mit unserer setValueAt gesammelt ().

Andere Tipps

Erweitern JTable mit diesem 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);
}

Das wird einen einzigartigen Box JComboBox Zellen-Editor für jede Combo erstellen Sie den Wert für zu bekommen.

Ich bin sicher, dass dies Ihr Problem lösen. Erwähnen Sie, in welcher Spalte Sie das Kombinationsfeld in .getColumn (int column) festlegen müssen

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

Sie müssen außer Kraft zu setzen:

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

... in Table. Der Wert dieser Methode übergeben ist, was Sie in Ihrem JComboBox setzen können. Das bedeutet, dass der ‚Wert‘ für diese bestimmte Zelle muss etwas sein, das in eine Sammlung übersetzt werden kann. Es könnte möglicherweise nur eine Liste der Objekte sein oder es könnte ein POJO mit Feldern, die in ein JComboBox gemacht werden könnten.

Also nur MyComboBoxEditor bearbeiten, um diese Methode außer Kraft setzen und das Modell für ein Objekt zu ermöglichen, ändern, die tatsächlich mehr anderen Objekte darstellt.

Das JComboBox Gehalt für jede Zeilenauswahl identisch machen, weil die JTable nicht bieten die Möglichkeit, mehr als einen Editor pro Spalte haben. Sie haben die Klasse JTable erweitern eine zusätzliche Auswahl für die Zeilen zu unterstützen.

Dieser Artikel erklärt, es sehr gut: http://www.javaworld.com/javaworld/javatips/jw-javatip102.html

Neben cellEditor ist es notwendig, die Cellrenderer zu tun, um die Combobox in der Zelle zu malen, schau mal:

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

Und dann überschreibt die toString Methode von JComboBox.

Diese Seite könnte Ihnen helfen , obwohl es Sie die gleiche Combobox zu haben, in allen Zellen in einer Spalte sind beschränkt zu sein scheint.

Sie brauchen eine Unterklasse von JTable zu erstellen, um die Methode Table getCellEditor (int row, int column) außer Kraft zu setzen.

So können Sie für jede Zeile und Spalte Kombination beliebige Zelleditoren einzustellen. Die Standardmethode ist der Zelleneditor für eine ganze Spalte zu setzen.

(Sie können auch durch zwingende getCellRenderer einzelne Zelle Renderer eingestellt.)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top