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