我在JTable
单元格内使用JTextField
;我使用TabelModel
,其中有JTable
的动态数据。现在,当我点击一个按钮时,我正在读取单元值。 问题是当前焦点没有返回更新值的单元格。例如,考虑这个程序:返回null的JTable单元格
import java.awt.BorderLayout;
import java.awt.Component;
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.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellRenderer;
public class MyTable extends JFrame {
DefaultTableModel tmodel = new DefaultTableModel(new Object[][]{
{"some"}, {"any"}, {"even"}, {"text"}, {"and"}, {""}},
new Object[]{"Column 1"});
public MyTable() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JTable table = new JTable(tmodel);
table.setDefaultRenderer(Object.class, new MyRenderer());
getContentPane().add(new JScrollPane(table), BorderLayout.CENTER);
getContentPane().setLayout(new GridLayout(2, 2));
JButton jb = new JButton("click me"); //button to display last cell data
jb.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
JOptionPane.showMessageDialog(
null, table.getModel().getValueAt(5, 0));
}
});
getContentPane().add(jb);
}
public static void main(String arg[]) {
new MyTable().setVisible(true);
}
}
class MyRenderer implements TableCellRenderer {
public Component getTableCellRendererComponent(JTable table, Object value,
boolean isSelected, boolean hasFocus, int row, int column) {
JTextField editor = new JTextField();
if (value != null) {
editor.setText(value.toString());
}
return editor;
}
}
这里我将离开最后一个字段为空。当我读到
table.getModel().getValueAt(5, 0)
我得到null
。现在我将值改为5,0,然后再次点击按钮,但现在我又得到了null
。现在令人惊讶的是,我编辑了一些其他单元格,再次单击按钮;现在我在单元格5,0处得到正确的数据!为什么是这样?这是一个错误?我尝试了几种可能性!
1)为了更好地提供帮助,请发布[SSCCE](http://sscce.org/)。 (例如应包括显式导入)2)请为代码块使用一致的逻辑缩进。 – 2012-03-26 15:12:20
检查'getValueAt(1,0)'是否返回'any',也许问题出在你的索引上? – maialithar 2012-03-26 15:29:09
@ h4b0不,不,我多次检查过。具有焦点的单元格返回旧值而不是更新的单元格。 – 2012-03-26 15:30:36