JTable单元格返回null [英] JTable cell returning null
问题描述
我在 JTable
单元格内使用 JTextField
;我使用 TabelModel
,其中包含 JTable
的动态数据。现在,当我点击一个按钮时,我正在读取一个单元格值。
问题是具有当前焦点的单元格不返回更新的值。例如,请考虑以下程序:
I am using JTextField
inside JTable
cells; I use a TabelModel
which has the dynamic data of the JTable
. Now, when I click a button, I am reading a cell value.
Problem is the cell which has the present focus doesn't return the updated value. For example, consider this program:
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;
}
}
这里我将最后一个字段留空。当我读它时
Here I am leaving the last field empty. When I read it by
table.getModel().getValueAt(5, 0)
我得到 null
。现在我将值更改为5,0,再次单击按钮,但现在我再次获得 null
。现在令人惊讶的是,我编辑了一些其他单元格,再次单击按钮;现在我在5,0单元得到了正确的数据!为什么是这样?这是一个错误吗?我尝试了几种可能性!
I get null
. Now I change the value at 5,0, and again click the button, but now again I get null
. Now surprisingly, I edit some other cell, again click button; now I get the correct data at cell 5,0! Why is this? Is this a bug? I tried several possibilities!
推荐答案
合并@ kleopatra的建议和@ mKorble有用的修订,这里有一些基于您的示例的其他想法。请特别注意使用 setDefaultButton()
和 行动
与 键绑定 。
Incorporating @kleopatra's suggestion and @mKorble's helpful revisions, here are a few additional ideas based on your example. Note in particular the use of setDefaultButton()
and Action
in conjunction with Key Bindings.
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.Action;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.KeyStroke;
import javax.swing.table.DefaultTableModel;
/** @see https://stackoverflow.com/q/9874664/230513 */
public class MyTable extends JFrame {
private static final String show = "Show";
private DefaultTableModel tmodel = new DefaultTableModel(
new Object[][]{
{"edit"}, {"any"}, {"cell"}, {"text"}, {"and"}, {"edit me"}},
new Object[]{
"Column 1"});
private JTable table = new JTable(tmodel);
private Action showAction = new ShowAction(show);
private JButton jb = new JButton(showAction);
public MyTable() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationByPlatform(true);
table.putClientProperty("terminateEditOnFocusLost", true);
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0);
table.getInputMap(JTable.WHEN_FOCUSED).put(enter, show);
table.getActionMap().put(show, showAction);
add(new JScrollPane(table), BorderLayout.CENTER);
table.setPreferredScrollableViewportSize(new Dimension(400, 200));
JPanel panel = new JPanel();
panel.add(jb);
getRootPane().setDefaultButton(jb);
add(panel, BorderLayout.SOUTH);
pack();
}
private class ShowAction extends AbstractAction {
private ShowAction(String name) {
super(name);
}
@Override
public void actionPerformed(ActionEvent e) {
if (table.isEditing()) {
table.getCellEditor().stopCellEditing();
}
int row = table.getSelectedRow();
if (row > -1) {
JOptionPane.showMessageDialog(
MyTable.this, table.getModel().getValueAt(row, 0));
}
}
}
public static void main(String arg[]) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new MyTable().setVisible(true);
}
});
}
}
这篇关于JTable单元格返回null的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!