JComboBox in JTable

Status
Nicht offen für weitere Antworten.

MQue

Top Contributor
Morgen,

ich hab in einer Spalte einer JTable eine JComboBox.class und frag mich gerade ob es möglich ist, dass in der ersten Zeile in der JComboBox gewisse Items drinnen sind, in der zweiten Zeile der JComboBox andere Items u.s.w.
oder müssen in allen JComboBoxen die gleichen Items drinnenstehen?



Code:
public class Main {

    public Main() {
        JFrame f = new JFrame();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JTable table = new JTable();
        DefaultTableModel model = (DefaultTableModel)table.getModel();
        model.addColumn("A", new Object[]{"item1"});
        model.addColumn("B", new Object[]{"item2"});
        model.addRow(new Object[]{"item2"});
        String[] values = new String[]{"item1", "item2", "item3"};
        int vColIndex = 0;
        TableColumn col = table.getColumnModel().getColumn(vColIndex);
        col.setCellEditor(new ComboBoxEditor(values));
        col.setCellRenderer(new ComboBoxRenderer(values));
        f.add(table);
        f.setBounds(10, 10, 700, 500);
        f.setVisible(true);
        }

    public static void main(String[] args) {
        new Main();
        }

   class ComboBoxRenderer extends JComboBox implements TableCellRenderer {
        public ComboBoxRenderer(String[] items) {
            super(items);
        }

        public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
            if (isSelected) {
                setForeground(table.getSelectionForeground());
                super.setBackground(table.getSelectionBackground());
            } else {
                setForeground(table.getForeground());
                setBackground(table.getBackground());
            }            
            setSelectedItem(value);
            return this;
        }
    }

   class ComboBoxEditor extends DefaultCellEditor {
        public ComboBoxEditor(String[] items) {
            super(new JComboBox(items));
        }
    }
}
 
entweder du hast mehrere JComboBoxen und gibts bei

public Component getTableCellRendererComponent(..) {
..
return this;
}

nicht this zurück, sondern eine der JComboBoxen abhängig von der Zeile

oder es bleibt so wie bisher und du setzt innerhalb von getTableCellRendererComponent() jedes Mal die passenden Werte/ das passende Model für die immer gleiche JComboBox

setSelectedItem(value); rufst du bereits auf, genausogut kannst du alle Items neu setzen abhängig von der Zeilennummer
 
hallo,

ich hab jetzt den TableCellRenderer auskommentiert, funktioniert aber genauso, der TableCellRenderer trägt also zum Verhalten nichts bei, jetzt ist mir nicht ganz klar, warum das so ist?
 
ok, Renderer vs Editor, der Renderer stellt wohl nur die Zelle ohne Editierung dar, da ist mehr als der aktuelle Wert vielleicht nicht enscheidend,

um den Editor gehts natürlich, hatte nicht so genau geschaut,
da ist es im Grunde das gleiche Spiel, wenn auch dank der Basisklasse zunächst weniger zu sehen ist,

eine Methode der Basisklasse ist
Code:
//  Implementing the CellEditor Interface
//
    /** Implements the <code>TableCellEditor</code> interface. */
    public Component getTableCellEditorComponent(JTable table, Object value,
                         boolean isSelected,
                         int row, int column) {
        delegate.setValue(value);
    return editorComponent;
    }
da sieht man, wie die JComboBox auch wieder nur letztlich der Rückgabewert irgendeiner Methode ist,
könnte also abhängig von der Zeilennummer verschiedene Objekte sein

aber da hier das delegate dazu kommt und bisschen Arbeit im Konstruktor,
würde es wohl eher schwieriger sein, das mehrfach zu definieren,

versuche also die andere Variante: ändere innerhalb von getTableCellEditorComponent() die Items der JComboBox bzw. dessen Models,
falls du das nicht kennst, dann besser erstmal in einer normalen JComboBox testen,
z.B. auf Buttonklick alle Elemente austauschen
 
Ich hab schnell mal ausprobiert, wenn ich bei gewissen ZEILEN der JTable nicht möchte, das die JComboBox erscheint, dass ich einfach null zurückgebe.
Das funktioniert so lange, wie ich in den Zeilen herumklicke, wo die JComboBox nicht erscheinen soll.

wenn ich in einer Zeile, wo die JComboBox erlaubt ist, etwas mit dieser einstelle und dann auf eine Zeile klicke, wo die JComboBox nicht erscheinen soll, dann erscheint diese trotzdem einmal. bei weiteren herumklicken auf Zeilen, wo de JComboBox nicht erscheinen soll, erscheint diese dann auch nicht mehr.
Keine Ahnung warum, was duzu jemand was,
Besten Dank,

Code:
@Override
   public Component getTableCellEditorComponent(final JTable table, final Object value, final boolean isSelected, final int row, final int column) {               
       if(something)
           return null;
       else {
           delegate.setValue(value);
           System.out.println("else: " + mainTree.getSelectionPath());
           return editorComponent;
            }
        }
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben