gpt4 book ai didi

java - 不要更新 JTable

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:18:21 28 4
gpt4 key购买 nike

我找到了更新数据的示例,但它使用的是 DefaultTableModel。当我创建我自己的 TableModel 和我自己的数据类时,当我将数据添加到 JTable 时它不会更新。

如何向我的 TableModel 添加监听器?

这是我的代码:

package by;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.util.LinkedList;

import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.AbstractTableModel;
public class DialogEg {
private static void createAndShowGui() {
MainWin mainPanel = new MainWin();
JFrame frame = new JFrame("DialogEg");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(mainPanel);
frame.pack();
frame.setLocationByPlatform(true);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGui();
}
});
}
}
class MainWin extends JPanel {
private String[] COL_NAMES = { "Last Name", "First Name" };
//private DefaultTableModel model = new DefaultTableModel(COL_NAMES, 0);
private MyTableModel model = new MyTableModel();
private JTextField lastNameField = new JTextField(15);
private JTextField firstNameField = new JTextField(15);

public MainWin() {
final JPanel dataPanel = new JPanel();
dataPanel.add(new JLabel("Last Name:"));
dataPanel.add(lastNameField);
dataPanel.add(Box.createHorizontalStrut(15));
dataPanel.add(new JLabel("First Name:"));
dataPanel.add(firstNameField);
JPanel btnPanel = new JPanel();
btnPanel.add(new JButton(new AbstractAction("Add Name") {
@Override
public void actionPerformed(ActionEvent arg0) {
lastNameField.setText("");
firstNameField.setText("");
int result = JOptionPane.showConfirmDialog(MainWin.this, dataPanel,
"Enter Name", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
String lastName = lastNameField.getText();
String firstName = firstNameField.getText();
Object[] dataRow = new String[] { lastName, firstName };
//model.addRow(dataRow);
Person person = new Person();
person.setFirstName(firstName);
person.setLastName(lastName);
model.addElement(person);
model.fireTableDataChanged();
}
}
}));
setLayout(new BorderLayout());
JTable jtable = new JTable(model);
//new JTable(model)
jtable.setModel(model);
add(new JScrollPane(jtable), BorderLayout.CENTER);
add(btnPanel, BorderLayout.SOUTH);
}
}
class MyTableModel extends AbstractTableModel {
private String[] columnNames = {
"Last name",
"First name"
};
//private LinkedList<Person> data = new LinkedList<Person>();
private LinkedList<Person> data = new LinkedList<Person>();
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.size();
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row,int col) {
switch(col) {
case 0: {
return data.get(col).getLastName();
}
case 1: {
return data.get(col).getFirstName();
}
default:
return "";
}
}
public void addElement(Person person) {
data.add(person);
}
public void fireTableDataChanged() {

}
}
class Person {
String last_name;
String first_name;
public Person() {
}
public void setLastName(String l_name) {
last_name = l_name;
}
public void setFirstName(String f_name) {
first_name = f_name;
}
public String getLastName() {
return last_name;
}
public String getFirstName() {
return first_name;
}
}

编辑2

这里我使用方法addElement:

 public void actionPerformed(ActionEvent arg0) {
lastNameField.setText("");
firstNameField.setText("");
int result = JOptionPane.showConfirmDialog(MainWin.this, dataPanel,
"Enter Name", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
String lastName = lastNameField.getText();
String firstName = firstNameField.getText();

Person person = new Person();
person.setFirstName(firstName);
person.setLastName(lastName);
//here i use add element
model.addElement(person);
}
}

这是我的 table 模型:

class MyTableModel extends AbstractTableModel {
private String[] columnNames = {
"Last name",
"First name"
};
//private LinkedList<Person> data = new LinkedList<Person>();
private LinkedList<Person> data = new LinkedList<Person>();
public int getColumnCount() {
return columnNames.length;
}
public int getRowCount() {
return data.size();
}
public String getColumnName(int col) {
return columnNames[col];
}
public Object getValueAt(int row,int col) {
switch(col) {
case 0: {
return data.get(col).getLastName();
}
case 1: {
return data.get(col).getFirstName();
}
default:
return "";
}
}

public void addElement(Person person) {
int firstRow = data.size() - 1;
int lastRow = firstRow;
fireTableRowsInserted(firstRow, lastRow);
}
}

当我添加了任何信息,但它没有更新。我必须在 jtable 中的什么地方放置此方法以正确更新数据?

最佳答案

你正在做两件非常危险的事情:

  • 您重写了 fireTableDataChanged() 并为其提供了一个空的方法主体,从而绕过了 super 方法所包含的所有魔力,并使其本质上成为一个毫无值(value)的方法,
  • 并且您在更改模型数据后没有调用任何 fireXXXChanged() 方法。

我建议你做完全相反的事情:

  • 不要覆盖 fireTableDataChanged()
  • 更改数据时调用 fireXXX() 方法。

例如:

public void addElement(Person person) {
data.add(person);
int firstRow = data.size() - 1;
int lastRow = firstRow;
fireTableRowsInserted(firstRow, lastRow);
}

// public void fireTableDataChanged() {
//
// }

顺便说一句:为什么要向 JTable 或其 TableModel 添加一个监听器?

编辑2
你声明:

I thought that i have to implement one of the firexxx method.

您的类扩展 AbstractTableModel 类而不是实现 TableModel 接口(interface)的原因是为了获得 AbstractTableModel 类必须提供的所有好东西,包括它的 fireXXX(...) 方法。它们已被连接以通知任何使用该模型的 JTables 数据已更改。如果您重写它们,尤其是如果您重写它们并且不调用任何 super 方法,那么您就破坏了这段有用的代码,它将不再有效。

As for LinkedList, i wanted to try use another collection(no array like in all samples).

由于您通常希望以随机方式访问数据,我认为您可以从 ArrayList 中获得更多 yield 。无论如何,集合变量应该是 List 接口(interface)类型,以便您可以根据需要更改集合对象的数据类型。

I don't understand why when i use your implementation it doesn't work.

如果您说某事“不起作用”并且您不解释它如何或为什么不起作用,您可能会看到什么错误,并且没有显示您的代码实现,那么您就束缚了我们的手脚并阻止我们能够有效地帮助你。如果您需要我们的帮助,请考虑向我们提供足够的信息,以便我们了解您的问题。这将包括向我们展示您对代码所做的任何更改、展示任何编译错误或异常消息,以及详细描述您的问题的具体情况。

编辑 3
在您最近的代码迭代中,您的 addElement 方法执行所有操作,但添加一个元素!

public void addElement(Person person) {
int firstRow = data.size() - 1;
int lastRow = firstRow;
fireTableRowsInserted(firstRow, lastRow);
}

在上面的方法中,您没有向 LinkedList 添加任何内容!

关于java - 不要更新 JTable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16178747/

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