我使用AbstractTableModel创建了一个自定义TableModel。我可以填充我的JTable。但我的JTable有一个按钮列说“Button1”。所以我使用CellRenderer方法向列添加按钮,CellEditor添加动作,但我在LINE:3处获得异常。
CustomModelForTable customTableModel = new CustomModelForTable(colNames, data);
tableA = new JTable(customTableModel);
**LINE:3**
tableA.getColumn("Button1").setCellRenderer(new JButtonRendererClass());
tableA.getColumn("Button1").setCellEditor(new ButtonEditor(new JCheckBox()));
我收到以下错误。
java.lang.IllegalArgumentException: Identifier not found
at javax.swing.table.DefaultTableColumnModel.getColumnIndex(DefaultTableColumnModel.java:265)
我收到此错误,因为我无法从自定义表中获取列。但有人可以帮我解决这个问题。
我正在使用以下source来执行此任务。在这个源代码中,他们使用的是DefaultTableModel,就像我的情况一样,我使用的是AbstractTableModel
。
答案 0 :(得分:3)
要按标识符检索列,您必须使用TableColumn.setIdentifier()设置列。
编辑:
请注意,根据TableColumn.getIdentifier()
的规格:
如果标识符为null,则getIdentifier()将getHeaderValue作为a返回 默认值。
这就是它在链接示例中的工作方式。
编辑:
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.DefaultTableCellRenderer;
import java.awt.GridLayout;
public class TableDemo extends JPanel {
public TableDemo() {
super(new GridLayout(1,0));
JTable table = new JTable(new MyTableModel());
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
table.getColumn("Column1").setCellRenderer(new TestCellRenderer());
table.getColumn("Column2").setCellRenderer(new TestCellRenderer());
}
class TestCellRenderer extends DefaultTableCellRenderer{ }
class MyTableModel extends AbstractTableModel {
private String[] columnNames = { "Column1", "Column2" };
private Object[][] data = { { "1", "1" }, { "2", "2" } };
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("TableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
TableDemo newContentPane = new TableDemo();
newContentPane.setOpaque(true);
frame.setContentPane(newContentPane);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
答案 1 :(得分:3)
1. @camickr使用Table Button Column
2. JButton
中的JTable
代表String value
中存储的XxxTableModel
,然后必须覆盖ColumnClass
public Class getColumnClass(int column) {
switch (column) {
case 0:
return Date.class;
case 1:
return Integer.class;
case 2:
return Long.class;
case 3:
return Double.class;
case 4:
return Boolean.class;
case 5:
return Icon.class;
default:
return String.class;
}
}
列中的单元格应该是可编辑的
public boolean isCellEditable(int row, int col) {
switch (col) {
case 0:
return false;
case 1:
return false;
default:
return true;
}
}
3.一切都与您的AbstractTableModel
有关,也许没有理由使用它,之前使用DefaultTableModel
,如果您理解How XxxTableModel works
,那么您可以覆盖{的方法{1}} JTable