Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在JTable中显示变量数据_Java_Swing_Jtable_Tablemodel - Fatal编程技术网

Java 在JTable中显示变量数据

Java 在JTable中显示变量数据,java,swing,jtable,tablemodel,Java,Swing,Jtable,Tablemodel,我已经看过很多教程/示例(我在这里花了很多时间),但我仍然不知道如何正确地使用JTable来表示在运行时更改的数据(都是字符串)。我不希望通过选择行/单元格对其进行修改。最初创建表(创建为空)后,我的程序在运行时修改数据(包括行数) 我尝试了一个内部类 private class PairingsTableModel extends AbstractTableModel { ... public void setValueAt(String value, int row, int col)

我已经看过很多教程/示例(我在这里花了很多时间),但我仍然不知道如何正确地使用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的实例变量,但是pairingsTableModel.getModel()似乎没有返回pairingsTableModel(调用pairingsTable.getModel().setValueAt(“Hello”,0,0)什么都不做,Eclipse认为我在任何地方都没有使用setValueAt)

您没有正确地重写setValueAt(…),通过使用String而不是Object的参数,实际上已重载了

这意味着以下调用TableModel.setValueAt(对象aValue、int ROWDINDEX、int columnIndex)而不是您的自定义方法setValueAt(字符串aValue、int ROWDINDEX、int columnIndex)

将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);
}

为了获得更好的帮助,请尽快发布。为什么要创建自定义的TableModel?DefaultMethod实现了您似乎需要的所有方法,setValueAt()、addRow(…)、removeRow(…)等等,@Micromancer我的答案能解决你的问题吗?你需要更多信息吗?1+,在你试图覆盖的方法之前使用@Override。如果你不正确地覆盖了方法签名,你将得到一个编译器错误。
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);
}