JComboBox in JTable

RalU

Mitglied
Hallo,
ich möchte alle Zellen einer Spalte mit jeweils einer JComboBox darstellen.
In Anlehnung an das Sun-Tutorial über JTable und diverse andere Informationsquellen hab ich folgenden Code probiert:
Code:
import java.util.*;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JTable;
import javax.swing.table.*;

public class EventTableModel extends AbstractTableModel
{
    private Event[] events;
    private String[] eventvalues;
    private TableColumn[] tcolumns;
    

    public EventTableModel()
    {
        //super();
        events=new Event[1];    
        eventvalues=
            new String[]{"Name","Datum","Ort","Uhrzeit","Status"};
        
        //Spalten setzten
        tcolumns=new TableColumn[eventvalues.length];
        
        for(int i=0;i<eventvalues.length; i++)
        {
            tcolumns[i]=new TableColumn();
        }
  
        setUpComoBox();
        
    
    }
    
    public void setUpComoBox()
    {
        JComboBox combobox=new JComboBox();
        combobox.addItem("geplant");
        combobox.addItem("gecancelt");
        combobox.addItem("hatstattgefunden");
        DefaultCellEditor ce=new DefaultCellEditor(combobox);
        tcolumns[4].setCellEditor(ce);
        System.out.println(tcolumns[4].getCellEditor());
    }
    
    
    public void setValueAt(Object value, int row, int col)
    {
        switch(col)
        {
        case 0: events[row].setName((String)value);
        case 1: events[row].setDate((String)value);
        case 2: events[row].setOrt((String)value);
        case 3: events[row].setUhrzeit((String)value);
        case 4: events[row].setStatus((String)value);
        
        }
    }

    public boolean isCellEditable(int row, int column)
    {
        return true;
    }
    
    public int getColumnCount()
    {
        return eventvalues.length;
    }
    
    public int getRowCount()
    {
        //System.out.println(events.length);
        return events.length;
    }
    
    public Object getValueAt(int row, int column)
    {
        Object o=null;
        switch (column)
        {
            case 0: o= events[row].getName();
            break;
            case 1: o= events[row].getDate();
            break;
            case 2: o=events[row].getOrt();
            break;
            case 3: o=events[row].getUhrzeit();
            break;
            case 4: o=events[row].getStatus();
            
        }
        return o;
    }
    
    public String getColumnName(int column)
    {
        return eventvalues[column];
    }

  //weitere Methoden zum Anlegen und löschen von Daten in dieser Modellklasse ausgelassen
Weiterhin hab ich eine Klasse, die von JTable ableitet und die obige Klasse als TableModel benutzt.

Mit der Methode "setUpComboBox()" - siehe Code oben möchte ich bewirken, dass alle Zellen der letzten Spalte außer der Spaltenüberschrift mit einer JComboBox dargestllt werden.

Aber genau das funktioniert nicht. Die Zellen werden ganz normal - ohne JComboBox dargestellt.
Und ich weiß nicht woran es liegen könnte.

Gruß, Ralf.
 
ok, ich hab jetzt mal eine Lösung gefunden. Allerdings ist mir nicht klar, warum diese Lösung funktioniert und mein Ansatz eben (siehe Code) nicht...

Und zwar hab ich folgendes geändert/ergänzt:
Code:
public void setUpComoBox(TableColumnModel tcm)
{
        JComboBox combobox=new JComboBox();
        combobox.addItem("geplant");
        combobox.addItem("gecancelt");
        combobox.addItem("hatstattgefunden");
        DefaultCellEditor ce=new DefaultCellEditor(combobox);
        TableColumn tc=tcm.getColumn(4);
        tc.setCellEditor(ce);
}
und dann in meiner Klasse, die von JTable ableitet im Konstruktor:
Code:
public EventTableView(EventTableModel etm)
{
        super(etm);
        //this.etm=etm;
        etm.setUpComoBox(this.getColumnModel());
}
Jetzt wird die JBomboBox wie gewünscht angezeigt.
Aber ich verstehe den Unterschied nicht:
Hier lass ich mir die gewünschte Spalte, in der die JComboBox
in den Zellen auftauchen soll ja über
Code:
getColumnModel.getColumn(4);
tc.setCellEditor(ce);
geben.

Bei meiner ersten Lösung, die leider nicht funktionierte,
geb ich die betreffende Spalte gleich an ohne getColumnModel.getColumn(4) zu verwenden.
(vgl. die Stelle:
Code:
tcolumns[4].setCellEditor(ce);

)
Hier versteh ich eben nicht, warum diese beiden Ansätze wohl nicht das Gleiche bewirken...
 
Zurück