Ich rendere eine JTable mit bestimmten Zellen, die eine normale Texteingabe oder eine ComboBox sind.Wie mache ich JTable mit mehreren Editor-Typen hintereinander?
Wenn ich versuche, es wie folgt aus:
package sandbox.jtablegui;
import java.awt.*;
import java.awt.event.*;
import java.util.List;
import java.util.ArrayList;
import java.util.Hashtable;
import javax.swing.*;
import javax.swing.table.*;
public class App extends JFrame
{
List<TableCellEditor> editors = new ArrayList<TableCellEditor>(3);
public App()
{
String[] colNames = { "Name", "Value" };
final String[] propertyNames = { "Val1", "Val2" };
DefaultTableModel model = new DefaultTableModel(colNames, 2) {
// set setting names
public Object getValueAt(int row, int col) {
if (col == 0)
return propertyNames[row];
return super.getValueAt(row, col);
}
public boolean isCellEditable(int row, int col) {
if (col == 0)
return false;
return true;
}
};
JComboBox<String> comboBox = new JComboBox<String>(new String[] { "Option1", "Option2" });
final DefaultCellEditor comboBoxEditor = new DefaultCellEditor(comboBox) {
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
Object val = value;
System.out.println(val);
if (val == null) {
val = ((JComboBox<?>) getComponent()).getItemAt(0);
System.out.println(val);
}
return super.getTableCellEditorComponent(table, val, isSelected, row, column);
}
};
JTable table = new JTable(model)
{
// Determine editor to be used by row
public TableCellEditor getCellEditor(int row, int column)
{
int modelColumn = convertColumnIndexToModel(column);
if (modelColumn == 1 && row == 1)
return comboBoxEditor;
else
return super.getCellEditor(row, column);
}
};
RowEditorModel rowEditorModel = new RowEditorModel();
JScrollPane scrollPane = new JScrollPane(table);
getContentPane().add(scrollPane);
}
public static void main(String[] args)
{
App frame = new App();
frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
frame.pack();
frame.setVisible(true);
}
public class RowEditorModel {
private Hashtable data;
public RowEditorModel() {
data = new Hashtable();
}
public void addEditorForRow(int row, TableCellEditor editor) {
data.put(new Integer(row), editor);
}
public void removeEditorForRow(int row) {
data.remove(new Integer(row));
}
public TableCellEditor getEditor(int row) {
return (TableCellEditor) data.get(new Integer(row));
}
}
}
Allerdings ist der Standardwert nicht in der JTable gezeigt, wie Sie aus dem Screenshot sehen.
bitte was Problem ist folgende officia Oracle-Tutorial, wie scheint, als RowEditorModel nicht abgeschlossen ist, gibt Bündel bessere Möglichkeiten sind (auf einen Wert an die XxxTableModel Speicherung) – mKorbel
ja, entdecken jetzt, dass die tablemodel sollte die Werte zB verwalten http://stackoverflow.com/questions/11858286/how-to-use-custom-jtable-cell-editor-and-cell-renderer? – poseid