Swing JCombobox in einem JTable vorbelegen

darkwall

Aktives Mitglied
Hallo,

ich habe folgendes Problem: Ich habe einen JTable mit drei Spalten, in der letzten befinden sich Comboboxen, alle mit gleichem Inhalt (Strings).
Nach dem Erstellen des Tables würde ich nun gerne die Comboboxen voreinstellen, falls sich ein Wert bereits in einer Datenbank befindet. Alle bisherigen Versuche (mit eingenem CellRenderer, AbstractTableModel ...) waren nicht erfolgreich. :bahnhof:
Hier der Table:
Java:
meintable = new JTable(5, 3) {
                @Override
                public TableCellEditor getCellEditor(int row, int column) {
                    if (column == 0 || column == 1) {
                        // für Spalte 0 und 1 normal
                        return super.getCellEditor();
                    } else {
                        // für Spalte 2 Drop-Down-Liste
                        return new DefaultCellEditor(getComboboxForThisCell()); // getComboboxForThisCell --> holt die entsprechende CB
                    }
                }
};


So, wie kann ich nun einen bestimmten String aus einer der Comboboxen voreinstellen? Ich weiß natürlich, dass ich mit setSelectedIndex() dies bei einer Combobox machen kann, aber wo mache ich das, wenn sich das Ding in einem JTable befindet?
Der Table wird korrekt angezeigt, auch kann ich die Werte auswählen. Wie mache ich jedoch die
Voreinstellung?

Bin für jede Hilfe sehr dankbar!!
Darkwall
 
In der Regel zeigen Renderer den Wert an der in der Zelle steht und CellEditoren treffen aufgrund des Wertes der Zelle eine Vorselektion (wenn sie vernünfig implementiert sind).
Da in deiner Tabelle noch keine Daten stehen wird nichts angezeigt. Sobald du die Tabelle mit Daten füllst wird der Wert in der Tabelle angezeigt und auch die DefaultCellEditoren sollten den korrekten Wert vorselektiert haben sobald sie geöffnet werden.

Wenn du willst, dass bei einem Editor ein ganz bestimmter Wert vorselektiert wird, kannst du beim Editor die Methode getTableCellEditorComponent überschreiben:
Java:
    public class ComboBoxEditor extends DefaultCellEditor {

        private final String    preselectedValue;

        public ComboBoxEditor( JComboBox<String> comboBox, String preselectedValue ) {
            super( comboBox );
            this.preselectedValue = preselectedValue;
        }

        @Override
        public Component getTableCellEditorComponent( JTable table, Object value, boolean isSelected, int row, int column ) {
            return super.getTableCellEditorComponent( table, preselectedValue, isSelected, row, column );
        }
    }
 
Hi Enceladus271,

vielen Dank für deine schnelle Antwort!

Ich habe deinen Code eingebaut und meinen entsprechend verändert.
Das Problem ist nun folgendes:

Die Werte in den Zellen sind da, aber beim Start wird noch nichts angezeigt. Erst wenn ich auf die Zelle mit der Combobox klicken, werden die Inhalte angezeigt. Ich habe mal in den Konstruktor deiner Klasse den preselected Value ausgegeben. Erst wenn ich die CB anwähle, wird diese offensichtlich erst erstellt.
Java:
public ComboBoxEditor(JComboBox<String> comboBox, String preselectedValue) {
            super(comboBox);
            System.err.println("preselectedValue="+preselectedValue);
            this.preselectedValue = preselectedValue;
        }
Wie kann ich es erreichen, dass die CBs direkt beim Start alle da sind?

Irgendwie stehe ich auf dem Schlauch! Das kann doch nicht so schwer sein.

Vielen Dank für deine und jede Hilfe!
 
CellEditoren werden nur für die Zelle angezeigt wo der Editor geöffnet ist, also normalerweise nur maximal in einer Zelle gleichzeitig. Wenn du möchtest dass die ComboBoxen immer angezeigt werden musst du einen CellRenderer nehmen. Der könnte etwa so aussehen:
Java:
    public class ComboBoxRenderer implements TableCellRenderer {

        private final JComboBox<String>    box    = new JComboBox<String>();

        @Override
        public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus,
                int row, int column ) {
            box.removeAllItems();
            if ( value != null ) {
                box.addItem( value.toString() );
            }
            return box;
        }
    }
 
Habe es jetzt richtig hinbekommen. Allerdings mit einem eigenen TableModel.
Ich habe mir das offizielle Beispiel von Oracle angeschaut: Java Tutorials Sample Code

Dort wird beim Erstellen nur der Standardwert übergeben. Erst danach wird dann die Combobox mit den Daten gefüllt und eingefügt.
 

Zurück
Oben