在JTable中显示可变数据

时间:2015-03-09 12:35:17

标签: java swing jtable tablemodel

我看了很多教程/示例(我在这里度过了很多时间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

1 个答案:

答案 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);
}