我发现更新数据的示例,但它使用DefaultTableModel。当我创建自己的TableModel和我自己的数据类时,当我将数据添加到JTable时,它不会更新。不更新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;
}
}
EDIT2
这里我用的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);
}
}
还有就是我的表模型:
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中进行正确的数据更新?
指出AbstractTableModel已经为你实现了fireTableDataChanged,因此你鼓励不要重写它的原因是 – MadProgrammer 2013-04-23 20:45:37
Thx,但是当我调用model.addElement(person);方法和之后model.fireTableDataChanged()它不能正常工作。 – veinhorn 2013-04-23 21:03:17
@BorisMonson:模型本身应该调用fire方法,他们应该在他们的add,remove方法中执行此操作,例如在上面的小代码片段中。另外:为什么要添加“听众”?另外为什么使用LinkedList作为模型的集合? – 2013-04-23 21:04:19