我从DefaultTableModel创建一个表,然后使用table.getModel()。setValueAt(value,row,col)在单元格中添加第一个值。但是,当我在该单元格上单击鼠标并将内部数据更改为第二个值时。然后我通过getValueAt(row,col)返回该值,它总是返回第一个值,即使在表格中第二个值显示在单元格中。我错了什么?
希望你理解我的混乱想法。
非常感谢! //////////////
感谢您的回答,我已经从您给我的链接中复制了代码并运行它。我有一个这样的测试:我修改Cell(0,3)的值,然后尝试获取该值(通过单击okButton)但值是旧的,而不是新的?
以下是代码:
package DialogExample;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
public class SimpleTableDemo extends JPanel implements TableModelListener {
private boolean DEBUG = false;
JTable table;
JButton okButton;
public JButton getOkButton() {
okButton = new JButton("OK");
okButton.addActionListener(new ActionListener() {
@Override //// modify value at the Cell(0,3) and then get that value out.
/// the value is the old, NOT the new one?????
public void actionPerformed(ActionEvent arg0) {
int i = (Integer) table.getModel().getValueAt(0, 3);
System.out.print(i);
}
});
return okButton;
}
public SimpleTableDemo() {
super(new GridLayout(1, 0));
String[] columnNames = { "First Name", "Last Name", "Sport",
"# of Years", "Vegetarian" };
Object[][] data = {
{ "Kathy", "Smith", "Snowboarding", new Integer(5),
new Boolean(false) },
{ "John", "Doe", "Rowing", new Integer(3), new Boolean(true) },
{ "Sue", "Black", "Knitting", new Integer(2),
new Boolean(false) },
{ "Jane", "White", "Speed reading", new Integer(20),
new Boolean(true) },
{ "Joe", "Brown", "Pool", new Integer(10), new Boolean(false) } };
table = new JTable(data, columnNames);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
if (DEBUG) {
table.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent e) {
printDebugData(table);
}
});
}
// Create the scroll pane and add the table to it.
JScrollPane scrollPane = new JScrollPane(table);
// Add the scroll pane to this panel.
add(scrollPane);
add(getOkButton());
}
public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow();
int column = e.getColumn();
TableModel model = (TableModel) e.getSource();
String columnName = model.getColumnName(column);
Object data = model.getValueAt(row, column);
// Do something with the data...
}
private void printDebugData(JTable table) {
int numRows = table.getRowCount();
int numCols = table.getColumnCount();
javax.swing.table.TableModel model = table.getModel();
System.out.println("Value of data: ");
for (int i = 0; i < numRows; i++) {
System.out.print(" row " + i + ":");
for (int j = 0; j < numCols; j++) {
System.out.print(" " + model.getValueAt(i, j));
}
System.out.println();
}
System.out.println("--------------------------");
}
/**
* Create the GUI and show it. For thread safety, this method should be
* invoked from the event-dispatching thread.
*/
private static void createAndShowGUI() {
// Create and set up the window.
JFrame frame = new JFrame("SimpleTableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// Create and set up the content pane.
SimpleTableDemo newContentPane = new SimpleTableDemo();
newContentPane.setOpaque(true); // content panes must be opaque
frame.setContentPane(newContentPane);
// Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
// Schedule a job for the event-dispatching thread:
// creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
答案 0 :(得分:2)
现在可能有效,
必须使用正确的TableModel
ColumnClass
码
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.event.TableModelEvent;
import javax.swing.event.TableModelListener;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
public class SimpleTableDemo extends JPanel implements TableModelListener {
private static final long serialVersionUID = 1L;
private boolean DEBUG = false;
private JTable table;
private JButton okButton;
private String[] columnNames = {"First Name", "Last Name", "Sport", "# of Years", "Vegetarian"};
private Object[][] data = {{"Kathy", "Smith", "Snowboarding", new Integer(5), (false)},
{"John", "Doe", "Rowing", new Integer(3), (true)},
{"Sue", "Black", "Knitting", new Integer(2), (false)},
{"Jane", "White", "Speed reading", new Integer(20), (true)},
{"Joe", "Brown", "Pool", new Integer(10), (false)}};
private TableModel model = new DefaultTableModel(data, columnNames) {
private static final long serialVersionUID = 1L;
@Override
public Class<?> getColumnClass(int column) {
return getValueAt(0, column).getClass();
}
};
private JButton getOkButton() {
okButton = new JButton("OK");
okButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent ae) {
int i = (Integer) table.getModel().getValueAt(0, 3);
System.out.print(i);
}
});
return okButton;
}
public SimpleTableDemo() {
super(new GridLayout(1, 0));
model.addTableModelListener(this);
table = new JTable(model);
table.setPreferredScrollableViewportSize(new Dimension(500, 70));
table.setFillsViewportHeight(true);
JScrollPane scrollPane = new JScrollPane(table);
add(scrollPane);
add(getOkButton());
}
public void tableChanged(TableModelEvent e) {
int row = e.getFirstRow();
int column = e.getColumn();
model = (TableModel) e.getSource();
String columnName = model.getColumnName(column);
Object datas = model.getValueAt(row, column);
System.out.println("Column ---> " + columnName + ", new value is " + datas);
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("SimpleTableDemo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
SimpleTableDemo newContentPane = new SimpleTableDemo();
newContentPane.setOpaque(true); // content panes must be opaque
frame.setContentPane(newContentPane);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
答案 1 :(得分:1)
如果没有SSCCE,我不确定您要做什么,但请先阅读有关JTables in general的教程,更具体地说,请先阅读model changes。