JTable mit ComboBoxen

Hallo,

Folgende Aufgabe die ich lösen muss:
Ich habe einen JTree und wenn ich auf eine entsprechende Node klick soll er mir ein neues Fenster öffnen mit einer Tabelle, diese soll aus zwei Spalten bestehen, aber unterschiedlich vielen Zeilen (je nach dem welche Node ich anklick).
So die erste Spalte soll mit Bezeichner gefüllt werden und in der zweiten Spalte soll immer die gleiche JComboBox rein, wobei die Elemente in der ComboBox wieder von Node zu Node unterschiedlich sind.
Daher habe ich mich dran versucht ein eigenes TableModel zu schreiben und einen Editor sowie ein Renderer,
Modell:

	
	Object[] data = {"",new JComboBox()};
	String[] spalten = {"Object", "Sollwert"};
	List<Object[]> daten = new ArrayList<Object[]>();
	
	
	@Override
	public int getRowCount() {
		// TODO Auto-generated method stub
		return daten.size();
	}

	@Override
	public int getColumnCount() {
		// TODO Auto-generated method stub
		return spalten.length;
	}

	@Override
	public Object getValueAt(int rowIndex, int columnIndex) {
		// TODO Auto-generated method stub

			return daten.get(rowIndex)[columnIndex];

	}
	
	public String getColumnName(int num){
		return spalten[num];
	}
	
	public void setValueAt(Object aValue, int rowIndex, int columnIndex){
	/*	if(columnIndex == 1){
			System.out.println("RRRRRROW "+rowIndex+" VALUEEEE :"+aValue);
			((JComboBox) daten.get(rowIndex)[columnIndex]).setSelectedItem(aValue);
			System.out.println("TEST ETST TE :"+((JComboBox) daten.get(rowIndex)[columnIndex]).getSelectedItem());
		}else{*/
		System.out.println("KLASSE VON VALUE :" +aValue.getClass() +" VALUE "+aValue);
		
			if(daten.get(rowIndex)[columnIndex] instanceof JComboBox) {
				System.out.println("BIN HIER");
				((JComboBox) daten.get(rowIndex)[columnIndex]).setSelectedItem(aValue.toString());
				System.out.println(((JComboBox) daten.get(rowIndex)[columnIndex]).getSelectedItem());
			}else{
				daten.get(rowIndex)[columnIndex]=aValue;
			}
	
		
		//}
			fireTableDataChanged();
	}
	
	public boolean isCellEditable(int row, int column){
		if (column == 1){
			return true;
		}else{
			return false;
		}
	}
	
	public void setNewRow(String oid, JComboBox box){
		data[0] = oid;
		data[1] = box;
		daten.add(data);
	}
	
	public Class getColumnClass(int num){
		if(num == 0)
			return String.class;
		return JComboBox.class;
	}

}```

Editor:
```public class TabEditor extends AbstractCellEditor implements TableCellEditor,ActionListener {
	
    private List<JComboBox> boxen = new ArrayList<JComboBox>();
    private int currentrow  = 0;
    
    public TabEditor(){
        
    }
    
    @Override
    public Object getCellEditorValue() {
        // TODO Auto-generated method stub
        return boxen.get(currentrow).getSelectedItem();
    }
 
    @Override
    public Component getTableCellEditorComponent(JTable table, Object value,
            boolean isSelected, int row, int column) {
        // TODO Auto-generated method stub
        currentrow = row;
        boxen.get(row).setSelectedItem(value);
        
        //table.getModel().setValueAt(boxen.get(row), row, column);
        System.out.println("TEST"+value);
        return boxen.get(row);
    }
    
    public void addBox(JComboBox box){
    	box.addActionListener(this);
        boxen.add(box);
    }

	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		stopCellEditing();
	}

}```

Renderer:

```public class TabRenderer /*extends DefaultTableCellRenderer*/ implements TableCellRenderer {
	
	List<JComboBox> boxen = new ArrayList<JComboBox>();
	int currentrow = 0;

    public TabRenderer(){
        super();
    }
    
 
    
     public void addBox(JComboBox box){
            boxen.add(box);
        }
     
 
    @Override
    public Component getTableCellRendererComponent(JTable table, Object value,
            boolean isSelected, boolean hasFocus, int row, int column) {
        // TODO Auto-generated method stub
        currentrow = row;
        boxen.get(row).setSelectedItem(value);
        return boxen.get(row);
    }
	 
}```

TestMain  (Hier Ohne Baum, da ich erstmal die Tabelle hinbekommen möchte)

```public class TableTest extends JFrame {

	private JPanel contentPane;
	private JTable table;
	private TabMod mod = new TabMod();
	private TabEditor ed= new  TabEditor();
	private TabRenderer ren = new TabRenderer();

	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					TableTest frame = new TableTest();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public TableTest() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(5, 28, 432, 234);
		contentPane.add(scrollPane);
		//Object[][] data = {{"TEST", "MU"},{"TEST","MUMU"}};
		//Object[] spalten = {"gg","bb"};
		table =  new JTable();

		table.setModel(mod);
		table.setDefaultEditor(JComboBox.class, ed);
	//	table.setDefaultRenderer(JComboBox.class, new DefaultTableCellRenderer());
		table.setDefaultRenderer(JComboBox.class, ren);
		table.setRowHeight(25);
		scrollPane.setViewportView(table);
		
		JButton btnWert = new JButton("wert");
		btnWert.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				getWert();
			}
		});
		btnWert.setBounds(34, 0, 91, 23);
		contentPane.add(btnWert);
		setTable();
		setTable();
		setTable2();
		getWert();
	}
	
	private void setTable(){
		TableColumn sportColumn = table.getColumnModel().getColumn(1);
		JComboBox comboBox = new JComboBox();
		comboBox.addItem("Snowboarding");
		comboBox.addItem("Rowing");
		comboBox.addItem("Chasing toddlers");
		comboBox.addItem("Speed reading");
		comboBox.addItem("Teaching high school");
		comboBox.addItem("None");
		
		mod.setNewRow("1", comboBox);
		ed.addBox(comboBox);
		ren.addBox(comboBox);
	
	}
	private void setTable2(){
		TableColumn sportColumn = table.getColumnModel().getColumn(1);
		JComboBox comboBox = new JComboBox();
		comboBox.addItem("Snowboarding");
		comboBox.addItem("KICK");
		comboBox.setSelectedItem("KICK");
		mod.setNewRow("1", comboBox);
		ed.addBox(comboBox);
		ren.addBox(comboBox);
		
	}
	
	private void getWert(){
		for(int i = 0; i<mod.getRowCount();i++){
			System.out.println(((JComboBox) mod.getValueAt(i, 1)).getSelectedItem());
		}
	}
}

Folgendes geht:
Ich kann die Items der ComboBoxen auswählen, diese werden zumindest in der Table übernommen
Folgendes geht nicht:
Wenn ich die Werte abfragen möchte, gibt er mir immer den Wert, der ComboBox in der letzten Zeile zurück und zwar für alle drei TestComboBoxen
die setValueAt -Methode meines Modells wird aufgerufen aber er übernimmt das .setSelectedItem(aValue) nicht:

hier der Konsolen output:
KLASSE VON VALUE :class java.lang.String VALUE Speed reading
BIN HIER
Snowboarding

Viel code, den ich jetzt (noch) nicht ausprobiert habe, aber unter http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#combobox ist ein Beispiel, wo ComboBoxes als Editoren verwendet werden - kannst du konkreter beschreiben, inwiefern das, was du machst, von diesem Fall abweicht?

habs jetzt gelöst mit dem tutorial. Verwende jetzt das DefaultTableModel und eben DEfaultCellEditor.
Muss zwar nun meine Table anderst initialisieren bzw. befüllen ist aber der einfachere Weg und funktioniert :smiley:

danke.

Da eben meine Zeilenanzahl variabel war dachte ich ich müsste mein eigenes TableModell schreiben

Hier nun Code der funktioniert:

import java.awt.EventQueue;

import javax.swing.DefaultCellEditor;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
import javax.swing.table.TableColumn;
import javax.swing.JTable;
import javax.swing.JScrollPane;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;


public class TableTest extends JFrame {

	private JPanel contentPane;
	private JTable table;
	private List<Object[]> data = new ArrayList<Object[]>();
	
	private String[] spalten = {"Object", "Sollwert"};

	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					TableTest frame = new TableTest();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	/**
	 * Create the frame.
	 */
	public TableTest() {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 450, 300);
		contentPane = new JPanel();
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		setContentPane(contentPane);
		contentPane.setLayout(null);
		
		JScrollPane scrollPane = new JScrollPane();
		scrollPane.setBounds(5, 28, 432, 234);
		contentPane.add(scrollPane);

		table =  new JTable();


		table.setRowHeight(25);
		scrollPane.setViewportView(table);
		
		JButton btnWert = new JButton("wert");
		btnWert.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				getWert();
			}
		});
		btnWert.setBounds(34, 0, 91, 23);
		table.setModel(new DefaultTableModel(spalten, 0));
		contentPane.add(btnWert);
		setTable();
		setRow();
		for(int i = 0; i<data.size(); i++)
			((DefaultTableModel) table.getModel()).addRow(data.get(i));
	}
	
	private void setTable(){
		TableColumn sportColumn = table.getColumnModel().getColumn(1);
		JComboBox comboBox = new JComboBox();
		comboBox.addItem("Snowboarding");
		comboBox.addItem("Rowing");
		comboBox.addItem("Chasing toddlers");
		comboBox.addItem("Speed reading");
		comboBox.addItem("Teaching high school");
		comboBox.addItem("None");
		sportColumn.setCellEditor(new DefaultCellEditor(comboBox));
	
	}
	
	private void setRow(){
		Object[] da = {"1", "Snowboarding"};
		data.add(da);
		Object[] das = {"2", "Rowing"};
		data.add(das);
		Object[] dass = {"3", "None"};
		data.add(dass);
		Object[] dasss = {"4", "Teaching hich school"};
		data.add(dasss);
		
	}
	
	private void getWert(){
		for(int i = 0; i<table.getRowCount();i++){
			System.out.println(table.getModel().getValueAt(i, 1));
		}
	}
}