Java JTable TableModel addRow没有变化

时间:2015-03-09 09:08:02

标签: 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());
}

System-Prints只是一个调试措施让我意识到更多。 每当这个方法运行时,我实际上都会向TableModel添加一些内容(由于out.prints而证明)

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

可能是什么原因?

编辑1:遗憾的是,我无法将代码段设置得足够小,无法在此处发布,但却包含错误。如果你们能给我一些可能导致上述行为的提示,我将非常感激。

EDIT2:我在代码中构建了一个变通方法。不知何故,问题似乎是由于为此操作使用两个不同的帧(一个帧要求使用值,第二个帧使用并显示该值)。

我用JDialog替换了一帧,现在TableModel正确更新了。我不知道使用两个帧有什么问题,但至少我的代码再次运行。谢谢你的帮助!

2 个答案:

答案 0 :(得分:0)

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

修改 fireTableDataChanged无法解决您的问题,因为它会在下面的评论中自动调用。

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

答案 1 :(得分:0)

我试着用你的方法编写这个简单的例子,它看起来很有效。

这是我的代码:

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,即new JTable(),添加到模型中的行都是空的(可以注意到查看终端中的打印件)即使我传递new String[] {neu}作为参数。这很奇怪,因为根据documentation,构造函数应该返回一个具有"默认数据模型"的JTable,我猜这是通过调用JTable的createDefaultDataModel()方法获得的,其{ {3}}反过来说,默认情况下会返回DefaultTableModel

修改 我现在注意到DefaultTableModel没有参数的构造函数构建了一个带有"零列和零行的表模型"。

正如peeskillet在评论中所指出的,总是记得将动作监听器添加到按钮中以实际让它们做某事!