在我的应用程序中有一个JTable,我想在创建表后插入行。
所有代码都在框架的构造函数中。
代码:
private TableModel model = new AbstractTableModel(){
String[] columnNames = {"First Name","Last Name","Sport","# of Years","Vegetarian"};
private Object[][] data = {};
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.length;
}
public String getColumnName(int col) {
return columnNames[col];
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
public Object getValueAt(int row, int col) {
return data[row][col];
}
public boolean isCellEditable(int row, int col) {
retuen false;
}
public Class getColumnClass(int c) {
return getValueAt(0, c).getClass();
}
};
table = new JTable(model);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBounds(5, 218, 884, 194);
//now adding this to the frame where I want to show
frame.add(scrollPane);
现在我想在表格中插入行或数据。这怎么可能。 以前我使用 DefaultTableModel 但我们不能在DefaultTableModel中使用isCellEditable和其他方法,所以我用上面的代码更改了它。但是在上面的代码中我无法明确地插入数据(行),请帮助我。
答案 0 :(得分:7)
像这样,你可以实现其他方法,如deleteRow(int rowIndex)和insertRowToIndex(int rowIndex,List rowData)。
更改数据后重新记录,你必须触发表事件,如fireTableRowsInserted()等
public static class MyTableModel extends AbstractTableModel
{
private List<String> columnNames = new ArrayList();
private List<List> data = new ArrayList();
{
columnNames.add("First Name");
columnNames.add("Last Name");
columnNames.add("Sport");
columnNames.add("# of Years");
columnNames.add("Vegetarian");
}
public void addRow(List rowData)
{
data.add(rowData);
fireTableRowsInserted(data.size() - 1, data.size() - 1);
}
public int getColumnCount()
{
return columnNames.size();
}
public int getRowCount()
{
return data.size();
}
public String getColumnName(int col)
{
try
{
return columnNames.get(col);
}
catch(Exception e)
{
return null;
}
}
public Object getValueAt(int row, int col)
{
return data.get(row).get(col);
}
public boolean isCellEditable(int row, int col)
{
return false;
}
public Class getColumnClass(int c)
{
return getValueAt(0, c).getClass();
}
};
public static void main(String[] args)
{
MyTableModel model = new MyTableModel();
model.addRow(Arrays.asList("yi", "chen", "sleep", 35, true));
JTable table = new JTable(model);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
JScrollPane scrollPane = new JScrollPane(table);
scrollPane.setBounds(5, 218, 884, 194);
//now adding this to the frame where I want to show
JFrame frame = new JFrame();
frame.add(scrollPane);
frame.setVisible(true);
}
答案 1 :(得分:1)
从DefaultTableModel
延伸而不是从AbstractTableModel
延伸应该可以解决问题。
答案 2 :(得分:1)
@Peter正确+1使用DefaultTableModel
而不是AbstractTableModel
,因为您的AbstractTableModel
错过了方法addRow();
(以及其他方法)
public void addRow(Object[][] data) {
this.data.add(data);
this.fireTableRowsInserted(data.size() - 1, data.size() - 1);
}
的示例
答案 3 :(得分:0)
我认为您需要在AbstractTableModel中实现setValueAt()
函数,以便您可以修改给定位置的任何数据。
仔细查看以下教程:
http://www.java2s.com/Code/Java/Swing-JFC/TablewithacustomTableModel.htm