我看了很多教程/示例(我在这里度过了很多时间http://docs.oracle.com/javase/tutorial/uiswing/components/table.html),我仍然无法弄清楚如何正确使用JTable来表示数据(它是运行时更改的所有字符串。我不希望通过选择行/单元来修改它。我的程序在运行时(包括行数)在最初创建表之后修改了数据(它被创建为空)。
我尝试了内部课程
private class PairingsTableModel extends AbstractTableModel {
...
public void setValueAt(String value, int row, int col) {
data[row][col] = value;
fireTableCellUpdated(row, col);
}
...
}
我的JTable实例化如下
JTable pairingsTable = new JTable(new PairingsTableModel());
它使用我提供的数据作为pairingsTableModel的实例变量,但是pairingsTable.getModel()似乎没有返回pairingsTableModel(调用pairingsTable.getModel()。setValueAt(" Hello", 0,0)什么都不做,Eclipse认为我没有在任何地方使用setValueAt
答案 0 :(得分:1)
你没有正确地覆盖 setValueAt(...),你实际上重载是通过使用String而不是Object ...
这意味着以下调用TableModel.setValueAt(Object aValue,int rowIndex,int columnIndex)而不是自定义方法setValueAt(String aValue,int rowIndex,int columnIndex)
pairingsTable.getModel().setValueAt("Hello", 0, 0)
将setValueAt()更改为以下内容,并且事情应该按预期开始工作
public void setValueAt(Object value, int row, int col) {
data[row][col] = (String)value;
fireTableCellUpdated(row, col);
}
完整MCVE
private static class PairingsTableModel extends AbstractTableModel {
private String[][] data = new String[][] { new String[] { "foo", "bar" } };
public void setValueAt(Object value, int row, int col) {
data[row][col] = (String)value;
fireTableCellUpdated(row, col);
}
@Override
public int getRowCount() {
return data.length;
}
@Override
public int getColumnCount() {
return 1;
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
return data[rowIndex][columnIndex];
}
}
private static int clock;
public static void main(String args[]) {
JFrame frame = new JFrame();
final PairingsTableModel model = new PairingsTableModel();
JTable pairingsTable = new JTable(model);
frame.setLayout(new BorderLayout());
frame.add(pairingsTable, BorderLayout.CENTER);
frame.setVisible(true);
new Timer().scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
pairingsTable.getModel().setValueAt("test" + clock++, 0, 0);
}
}, 0, 1000);
}