我遇到的问题多于问题,希望你能帮我找到可能的原因。
在一个非常简单的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正确更新了。我不知道使用两个帧有什么问题,但至少我的代码再次运行。谢谢你的帮助!
答案 0 :(得分:0)
当您更改tableModel中的数据时,表不会重新绘制。在向表模型添加新行后尝试调用model.fireTableDataChanged();
。
修改强>
fireTableDataChanged
无法解决您的问题,因为它会在下面的评论中自动调用。
我看到的另一个问题是您有两个不同的字段/数据模型 - mdlUebersetzung
和model
。一个用于登录,一个用于添加路由。它是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在评论中所指出的,总是记得将动作监听器添加到按钮中以实际让它们做某事!