我已经看过很多教程/示例(我在这里花了很多时间 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)
最佳答案
您没有正确地重写 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);
}
关于java - 在 JTable 中显示变量数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28942151/