Java 通过单击JButton重新制作JTable

Java 通过单击JButton重新制作JTable,java,swing,jtable,tablemodel,Java,Swing,Jtable,Tablemodel,我有一个JTable,它是9乘3(27个单元格),但是如果用户单击一个按钮,我希望表格改变,不仅填充新数据,而且可能填充不同数量的单元格。我不知道该怎么做 我已尝试从父表中删除该表并创建该表的新实例。什么也没发生。在这里: somepanel.remove(thetable); JTable newtable = new JTable(datainavector,columntitles); 我想知道我怎样才能做到这一点 a) 从面板中删除表格,并使用不同的形状“将其放回” 或 b) 更改表格

我有一个JTable,它是9乘3(27个单元格),但是如果用户单击一个按钮,我希望表格改变,不仅填充新数据,而且可能填充不同数量的单元格。我不知道该怎么做

我已尝试从父表中删除该表并创建该表的新实例。什么也没发生。在这里:

somepanel.remove(thetable);
JTable newtable = new JTable(datainavector,columntitles);
我想知道我怎样才能做到这一点

a) 从面板中删除表格,并使用不同的形状“将其放回” 或
b) 更改表格的内容(可能还有形状)。

没关系。我通过创建新表并将旧表的可见性设置为false对其进行排序

您可能希望通过setModel(…)方法更改现有表的TableModel。使用包含感兴趣的数据和列字符串的DefaultTableModel对象(使用接受两个参数的构造函数,一个一维对象数组和一个二维对象数组)。

示例中唯一缺少的是调用
invalidate()
repaint()
但是我建议改为更改表格模型:

publicstaticvoidmain(字符串[]args)引发异常{
JFrame=新JFrame(“测试”);
最终JTable表=新JTable(generateRandomTableModel());
frame.add(新的JScrollPane(表));
frame.add(新的JButton(新的抽象操作(“更改数据”){
@凌驾
已执行的公共无效操作(操作事件e){
table.setModel(generateRandomTableModel());
}
}),边界布局(南部);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
框架。设置尺寸(400400);
frame.setVisible(true);
}
公共静态TableModel GeneratorDomainTableModel(){
随机r=新随机();
字符串[][]数据=新字符串[r.nextInt(10)+1][r.nextInt(10)+1];
String[]colNames=新字符串[数据[0]。长度];
对于(int i=0;i
哼哼,你对更好的解决方案不感兴趣吗?不是一个好的解决方案。将其可见性设置为false并不能删除该表。这张桌子和它的模型还在记忆中。换个型号吧。我想我有点太激动了。我将研究更改表格模型。+1,所有对可见表格的更新都应通过模型完成。这包括创建一个全新的模型。并确保在EDT中进行这些更改(意思是EventQueue.invokeLater(…)。@Paulo:yes,除非API中特别声明为线程安全,否则所有Swing代码都是如此。
public static void main(String[] args) throws Exception {

    JFrame frame = new JFrame("Test");

    final JTable table = new JTable(generateRandomTableModel());
    frame.add(new JScrollPane(table));

    frame.add(new JButton(new AbstractAction("Change data") {
        @Override
        public void actionPerformed(ActionEvent e) {
            table.setModel(generateRandomTableModel());
        }
    }), BorderLayout.SOUTH);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 400);
    frame.setVisible(true);
}

public static TableModel generateRandomTableModel() {
    Random r = new Random();
    String[][] data = new String[r.nextInt(10) + 1][r.nextInt(10) + 1];
    String[] colNames = new String[data[0].length];

    for (int i = 0; i < data[0].length; i++) {
        colNames[i] = "" + r.nextInt(100);
        for (int j = 0; j < data.length; j++)
            data[j][i] = "" + r.nextInt(1000);
    }

    return new DefaultTableModel(data, colNames);
}