gpt4 book ai didi

java - 使用 DefaultTableModel 时刷新 JTable 中的数据

转载 作者:行者123 更新时间:2023-12-01 23:06:39 25 4
gpt4 key购买 nike

我有一个 JFrame,我在其中构建 JTable

JTable 分两步制作:

  1. 我创建了一个函数 initTable() 来制作表格

  2. 我创建了另一个函数 initDataintoTable(),它将数组列表中的数据广告到我的表中。

到目前为止一切正常。当我尝试更新我的 JTable 时,问题就出现了。事实上,我打开一个 JDialog 并尝试列表中的一个新项目。我已经到了用新项目修改 Arraylist 的地步,但之后我无法更新我的表,我真的不知道将 fireTableDataChanged() 放在哪里code> 例如,以及如何在需要时调用它。

在 initDataintoTable 中,我向我的 DefaultTableModel 表模型添加了一个 TableModelListener。

protected void initDataIntoTable() {
tablemodel.setRowCount(0);

for (//every item on my list) {
String[] row = {dataitem, dataitem2};
tablemodel.addRow(row);
}

TableModelListener myjtable_listener = new TableModelListener() {
public void tableChanged(TableModelEvent e) {
// I have to write something here to update my table ?
// I don't know if it's here where I have to update my table and if it is, how should I call this listener from the place I want to update ?
tablemodel.fireTableDataChanged(); // ?
}
};
table.getModel().addTableModelListener(jtable_listener);
//tablemodel.addTableModelListener(myjtable_listener);
}
}

在我的 jDialog 中,“确定”按钮上有一个 ActionListener:

class OKButton implements ActionListener {
public void actionPerformed(ActionEvent e) {
// Here I manage to get my updated list of objects
// What should I call here to update my jtable ?
}
}
okbutton.addActionListener(new OKButton());

我已经在这个网站上看到了一些问题,但我尝试过的任何方法都不适用于我的程序。感谢您的帮助,并对我的英语感到抱歉。

最佳答案

您永远不必显式调用 fireTableDataChanged 方法,因为它取决于 TableModel当数据发生更改(插入/更新/删除)时通知 View 的实现。

在您的情况下,调用 tablemodel.addRow(...) 就足够了:表 model 将通知 查看数据已更改,最后一个数据将更新。

okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
...
((DefaultTableModel)table.getModel()).addRow(...);
...
}
};

编辑

您在评论中指出:

I can't do jframe.getTable() without having getTable static, and I can't get getTable() static without making table static. After doing this, my program works just like I wanted to.

如果您必须添加 static 修饰符才能使其正常工作,那么您就会遇到设计问题。您的代码中可能存在变量范围问题。请参阅下面的示例:InputDialog 是一个不同的类,它保存对表模型的引用,没有任何static 变量。

import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Window;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.util.Date;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

public class Demo {

private void createAndShowGUI() {

DefaultTableModel model = new DefaultTableModel(new Object[]{"TimeStamp", "Value"}, 0) {
@Override
public Class<?> getColumnClass(int columnIndex) {
switch(columnIndex) {
case 0: return Date.class;
default: return super.getColumnClass(columnIndex);
}
}
};

final JTable table = new JTable(model);

JButton button = new JButton("Add entry...");
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
new InputDialog((DefaultTableModel)table.getModel()).createAndShowGUI();
}
});

JFrame frame = new JFrame("Demo");
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.add(new JScrollPane(table), BorderLayout.CENTER);
frame.add(button, BorderLayout.SOUTH);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}

class InputDialog {

private final DefaultTableModel model;

public InputDialog(DefaultTableModel model) {
this.model = model;
}

public void createAndShowGUI() {

final JTextField textField = new JTextField(10);
textField.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
model.addRow(new Object[]{new Date(), textField.getText()});
Window window = SwingUtilities.windowForComponent((Component)e.getSource());
window.dispatchEvent(new WindowEvent(window, WindowEvent.WINDOW_CLOSING));
}
});

JPanel panel = new JPanel();
panel.add(new JLabel("Please input a value and press ENTER key:"));
panel.add(textField);

JDialog dialog = new JDialog();
dialog.setModal(true);
dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
dialog.add(panel);
dialog.pack();
dialog.setLocationRelativeTo(null);
dialog.setVisible(true);
}

}

public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new Demo().createAndShowGUI();
}
});
}
}

关于java - 使用 DefaultTableModel 时刷新 JTable 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22648359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com