我需要我的JTable来验证给定行的数据,并将列1的组件更改为一个JButton,标签为"Save“(准备保存),如果验证确定数据是安全的。我需要对每一次击键做出反应。
无论我尝试了多少事情,用户似乎都被迫关闭单元编辑器(通过单击其他地方或按Enter键),然后才能评估数据。
您知道有一种方法可以让密钥侦听器(或其他方法)提供即时反馈,而不是强制执行额外的键/鼠标敲击吗?
使用DefaultCellEditor的数据估值仍然需要额外的击键,而KeyBindings (显然不需要)似乎只需要对特定的键做出反应。
是否有一种方法可以提供一个侦听器,以便对编辑器中的每一个击键立即作出反应?
m0skit0对问题的跟进
问:我试过什么?
答:我有一个名为ButtonColumn的类,它是从罗布·卡米克改编而来的,它使用的是TableCellRenderer。
这将验证行数据,如果验证成功,则将单元格呈现为标记为“保存”的JButton,否则将返回带有纯文本标签“新建…”的theDefaultRendererComponent。(红色字体)。
我有另一个实现KeyListener的类,它在用户每次击键时重新绘制表,从而执行SaveButtonRowFormatter验证和呈现(如前所述)。
这是可行的,但只有在关闭的单元格编辑器之后。这就是问题所在:用户必须完成关闭编辑器的工作,才能呈现表并显示保存按钮。这是不直观的,因为没有明显的理由,为什么用户会进行任何击键后,他们确定他们已经成功地填写了记录。此时没有任何保存按钮,他们就被卡住了。
发布于 2015-02-14 11:45:59
是否有一种方法可以提供一个侦听器,以便对编辑器中的每一个击键立即作出反应?
向编辑器的编辑器组件中添加一个DocumentListener。
DefaultCellEditor dce = (DefaultCellEditor)table.getDefaultEditor(Object.class);
JTextField textField = (JTextField)dce.getComponent();
textField.getDocument().addDocumentListener(...);
有关更多信息,请阅读有关如何编写文档侦听器的Swing教程中的部分。
发布于 2015-02-14 10:50:43
最简单的方法是使用:
table.putClientProperty("terminateEditOnFocusLost", Boolean.TRUE);
否则,您可以执行以下操作:
在按钮的ActionListener
中,您可以简单地执行if(table.getCellEditor()!=null) table.getCellEditor().stopCellEditing();
请参阅此示例,该示例首先打印模型,然后再打印。
要尝试它,只需开始编辑任何单元格,然后按"Save“(没有单击其他任何地方或取消编辑状态),您将看到控制台中的输出是不同的(第二个输出考虑了您所做的最后修改)。
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableModel;
public class TestEditableTable {
protected void initUI() {
JFrame frame = new JFrame(TestEditableTable.class.getSimpleName());
Vector<Vector<String>> data = new Vector<Vector<String>>();
for (int i = 0; i < 2; i++) {
Vector<String> row = new Vector<String>();
for (int j = 0; j < 5; j++) {
row.add("Cell " + i + "," + j);
}
data.add(row);
}
Vector<String> columns = new Vector<String>();
for (int j = 0; j < 5; j++) {
columns.add("Column " + j);
}
final TableModel model = new DefaultTableModel(data, columns);
final JTable table = new JTable(model);
frame.add(new JScrollPane(table), BorderLayout.CENTER);
JButton save = new JButton("Save");
save.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
printDataModel(model);
if (table.getCellEditor() != null) {
table.getCellEditor().stopCellEditing();
}
printDataModel(model);
}
private void printDataModel(final TableModel model) {
StringBuilder sb = new StringBuilder();
for (int i = 0; i < model.getRowCount(); i++) {
for (int j = 0; j < model.getColumnCount(); j++) {
sb.append(model.getValueAt(i, j)).append(' ');
}
sb.append("\n");
}
System.out.println(sb);
}
});
frame.add(save, BorderLayout.SOUTH);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new TestEditableTable().initUI();
}
});
}
}
https://stackoverflow.com/questions/28518733
复制