Java Don';t更新JTable
我找到了更新数据的示例,但它使用DefaultTableModel。当我创建自己的TableModel和数据类时,当我将数据添加到JTable中时,它不会更新 如何将侦听器添加到我的TableModel 这是我的密码:Java Don';t更新JTable,java,swing,linked-list,jtable,abstracttablemodel,Java,Swing,Linked List,Jtable,Abstracttablemodel,我找到了更新数据的示例,但它使用DefaultTableModel。当我创建自己的TableModel和数据类时,当我将数据添加到JTable中时,它不会更新 如何将侦听器添加到我的TableModel 这是我的密码: package by; import java.awt.BorderLayout; import java.awt.event.ActionEvent; import java.util.LinkedList; import javax.swing.AbstractAction
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;
}
}
这是我的桌子模型:
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);
}
}
类MyTableModel扩展了AbstractTableModel{
私有字符串[]列名称={
“姓氏”,
“名字”
};
//私有LinkedList数据=新LinkedList();
私有LinkedList数据=新LinkedList();
public int getColumnCount(){
返回columnNames.length;
}
public int getRowCount(){
返回data.size();
}
公共字符串getColumnName(int-col){
返回列名[col];
}
公共对象getValueAt(整数行,整数列){
开关(col){
案例0:{
返回data.get(col.getLastName();
}
案例1:{
返回data.get(col.getFirstName();
}
违约:
返回“”;
}
}
公共无效补遗(人){
int firstRow=data.size()-1;
int lastRow=第一行;
fireTableRowsInserted(第一排,最后一排);
}
}
当我添加了任何信息,但没有更新。我必须在jtable中使用此方法进行正确的数据更新吗?您正在做两件非常危险的事情:
- 您正在重写
并为其提供一个空的方法体,从而绕过super方法包含的所有魔法,使其本质上成为一个毫无价值的方法fireTableDataChanged()
- 更改模型数据后,您不会调用任何
方法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你说: 我认为我必须实现firexxx方法之一 您的类扩展AbstractTableModel类而不是实现TableModel接口的原因是为了获得AbstractTableModel类必须提供的所有优点,包括它的
fireXXX(…)
方法。它们已经连接到通知任何使用该模型的JTables数据已经更改。如果您重写它们,尤其是如果您重写它们并且不调用任何超级方法,那么您已经破坏了这段有用的代码,它将不再工作
至于LinkedList,我想尝试使用另一个集合(没有像所有示例中那样的数组)
由于您通常希望以随机方式访问数据,因此我认为您可以从ArrayList中获得更多的钱。无论如何,集合变量可能应该是列表接口类型,以便您可以根据需要更改集合对象的数据类型
我不明白为什么我使用您的实现时它不起作用
如果您说某些东西“不起作用”,并且没有解释它如何或为什么不起作用,您可能会看到哪些错误,并且没有展示您的代码实现,那么您就束缚了我们的手脚,阻止我们有效地帮助您。如果你需要我们的帮助,考虑给我们足够的信息,让我们了解你的问题。这将包括向我们显示对代码的任何更改、显示任何编译错误或异常消息,以及详细描述问题的细节
编辑3在最近的代码迭代中,addElement方法除了添加元素之外,什么都做
您不需要在上面的方法中向LinkedList添加任何内容 指出AbstractTableModel已经为您实现了fireTableDataChanged,因此我们鼓励您不要重写itThx,而是在我调用model.addElement(person)时重写;方法,然后再调用该模型。fireTableDataChanged()它不能正常工作。@BorisMonson:模型本身应该调用fire方法,它们应该在其add、remove方法中执行此操作,例如在上面的小代码段中。还有:再说一遍,为什么要添加一个“倾听者”?还有,为什么要使用LinkedList作为模特的收藏?@BorisMonson:请参见编辑3。另外,考虑通过创建和发布一个.HoVrCRAFTFulfOFEL来简化你的问题:哇,说真的,我真的在寻找这样的解释,以便在代码< jtab> /代码> thigy中获得一些兴趣。Java文档中使用的措辞总是让我难以理解,但是你的话,wowo做了一些魔术。但愿我能多投几次票:-)
public void addElement(Person person) {
data.add(person);
int firstRow = data.size() - 1;
int lastRow = firstRow;
fireTableRowsInserted(firstRow, lastRow);
}
// public void fireTableDataChanged() {
//
// }
public void addElement(Person person) {
int firstRow = data.size() - 1;
int lastRow = firstRow;
fireTableRowsInserted(firstRow, lastRow);
}