Java JTable TableModel addRow无更改

Java JTable TableModel addRow无更改,java,swing,jtable,tablemodel,Java,Swing,Jtable,Tablemodel,我有一个问题,而不是一个问题,希望你能帮我找到可能的原因 在一个非常简单的JTable中,我使用了DefaultTableModel。我在运行时以编程方式添加一行,如下所示: public void Update(String neu) { System.out.println(model.getDataVector()); model.addRow(new String[] {neu}); System.out.println(model.getDataVector

我有一个问题,而不是一个问题,希望你能帮我找到可能的原因

在一个非常简单的
JTable
中,我使用了
DefaultTableModel
。我在运行时以编程方式添加一行,如下所示:

public void Update(String neu) {
    System.out.println(model.getDataVector());

    model.addRow(new String[] {neu});

    System.out.println(model.getDataVector());
}
系统打印只是一个调试措施,让我了解更多。 每当此方法运行时,我实际上会向
表格模型中添加一些内容(由于out.prints而证明)

但这种变化并非永久性的。下次调用方法更新时,我看不到表中有任何更改,也看不到
TableModel
中的“新值”部分

原因可能是什么

Edit1:遗憾的是,我不能让一个代码片段小到可以发布到这里,同时又包含错误。不过,如果你们能给我一些提示,我会非常感激。所有这些提示都可能导致上述行为

EDIT2:我在代码中构建了一个变通方法。不知何故,该问题似乎是由于使用两个不同的帧来执行此操作(一个帧用于请求值,另一个帧用于使用和显示此值)而引起的


我用JDialog替换了一个框架,现在TableModel更新正确了。我不知道使用两个帧的问题是什么,但至少我的代码重新工作了。谢谢你的帮助

更改tableModel中的数据时,不会重新绘制表格。尝试调用
model.fireTableDataChanged()将新行添加到表模型后

编辑:
fireTableDataChanged
不会解决您的问题,因为它会自动调用,如下面的注释所述


我看到的另一个问题是,您有两个不同的字段/数据模型-
mdlUebersetzung
model
。一个用于登录,一个用于添加行。它是TableModel的同一个实例吗?

我尝试使用您的方法编写这个简单的示例,看起来效果不错

这是我的密码:

import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import javax.swing.table.*;

public class MyTable extends JFrame implements ActionListener {

    private JTable table;
    private DefaultTableModel model;

    private JButton addButton; // by clicking the button a new row will be added to the table

    // just create the table and set up the interface
    public MyTable() {
        table = new JTable(0,1); // this creates a new Table with 0 rows and 1 column having a DefaultTableModel
        model = (DefaultTableModel) table.getModel();

        JScrollPane tablePanel = new JScrollPane(table);

        addButton = new JButton("Add row");
        addButton.addActionListener(this);
        JPanel buttonPanel = new JPanel();
        buttonPanel.add(addButton);

        setLayout(new BorderLayout());
        add(tablePanel);
        add(buttonPanel, BorderLayout.PAGE_END);

        setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

        pack();
        setVisible(true);
    }

    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == addButton) {
            Update("new Row text");
        }
    }

    public void Update(String neu) {
        System.out.println(model.getDataVector());

        model.addRow(new String[] {neu});

        System.out.println(model.getDataVector());
    }

    public static void main(String[] args){
        new MyTable();
    }
}
我注意到的一点是,如果我使用无参数的构造函数创建JTable,即
newjtable()
,则添加到模型中的行都是空的(从终端中的打印可以看出),即使我将
新字符串[]{neu}
作为参数传递。这很奇怪,因为根据该构造函数应该返回一个具有“默认数据模型”的JTable,我猜这是通过调用JTable的
createDefaultDataModel()
方法获得的,该方法反过来说,默认情况下它返回一个
DefaultTableModel

编辑: 我现在注意到,没有参数的
DefaultTableModel
构造函数构建了一个“零列零行”的表模型


正如peeskillet在一篇评论中所指出的,始终记得将动作监听器添加到按钮中,以使它们实际执行某些操作

这是由
DefaultTableModel
自动完成的,调用
fireTableRowsInserted
实际上效率更高。我用model替换了mdlUebersetzung,但忘了打印中的那些。在真实的代码中只有一个模型我看到你从一个模型中打印出数据,然后在另一个模型中添加一行。要获得更好的帮助,请通读一遍,然后实现从reading@peeskillet你当然是绝对正确的,我从一开始就应该这样做。我添加了示例代码来解决我的问题除了您从未将操作侦听器添加到
TestFrameText
类中的按钮之外,它还能工作fine@peeskillet再次感谢。是的,一个超级类在实际代码中处理了这个问题,但在本例中却忘记了它,这使得本例能够正常工作。遗憾的是,我似乎无法重现一个小到足以包含错误的代码片段,但又短到可以在这里发布。。。您对上述错误的发生有何看法?谢谢您的帮助。代码片段最终确实起了作用,但真正代码的问题在于其他地方。一般来说,什么会导致上述问题中提到的行为?因为您在表中看不到更改,更改也不会导致后续调用,但仍然可以看到在终端中打印的正确值。我要做的第一件事是再次检查您是否真的将新行添加到正确的模型中。是否可能您正在修改表格模型的不同距离?它是正确的模型。我用table.getModel()替换了模型,但仍然得到了相同的结果。这很奇怪。我只能认为,由于某种原因,模型在某个时候被清空了。如果可以,试着调试代码——应该可以在对类的modelmeber的任何访问上设置断点。这样你就可以看到是否有什么东西在修改它。