如何在编辑时更改 JTable 单元格文本?
How to change JTable cell text while editing?
我想要达到的效果是:每次用户开始编辑 table 中的单元格时,我希望单元格的文本擦除原来存在的任何文本('Start Editing' 部分),如果没有添加新文本,则将文本设置为原始文本 ('Stop Editing')
在我看来,我错误地假设 setValueAt 会更改当前正在编辑的单元格中的文本 - 相反,它似乎只会在编辑完成后更改单元格的值(这意味着我可能根本不需要放在 'Stop Editing' 下的代码)
但是,如果确实如此,我不知道如何编辑当前正在编辑的单元格中的文本,所以这是我的问题:如何更改当前正在编辑的单元格中的文本?
例如,当我开始编辑 'Test bb,' 时,单元格变为没有文本:
这是我的代码:
private void tblEntriesPropertyChange(java.beans.PropertyChangeEvent evt) {
swb.tablePropertyChange(tblEntries, evt);
}
public void tablePropertyChange(JTable jtable, PropertyChangeEvent evt) {
TableModel mdl = jtable.getModel();
int c = jtable.getSelectedColumn();
int r = jtable.getSelectedRow();
if (r >= 0 && c >= 0) {
String text = mdl.getValueAt(r, c) + "";
if (evt.getNewValue() == null) {
System.out.println("Stop Editing");
String newText = mdl.getValueAt(r, c) + "";
if (newText.length() <= 0) {
jtable.setValueAt(text, r, c); // also tried: mdl.setValueAt(text, r, c);
}
} else {
System.out.println("Start Editing");
jtable.setValueAt("", r, c); // also tried: mdl.setValueAt("", r, c);
}
}
}
在这种过程中尝试 "intervene" 可能是一个真正的技巧。你有两个基本的选择。您可以创建自定义 JTable
实现并确保将 null
之类的内容传递给任何激活的编辑器,这会锁定您一次使用 JTable
,或者您可以提供自己的编辑.
public class CleanCellEditor extends DefaultCellEditor {
public static CleanCellEditor make() {
JTextField field = new JTextField();
field.setBorder(null);
System.out.println("make");
return new CleanCellEditor(field);
}
public CleanCellEditor(JTextField textField) {
super(textField);
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
return super.getTableCellEditorComponent(table, null, isSelected, row, column);
}
}
虽然这稍微好一点,但事实上您可以将它应用于 JTable
的任何实现,这确实意味着您需要为所有可能的 values/types 创建一个 table 可能需要支持
作为一个基本示例...
import java.awt.Component;
import java.awt.EventQueue;
import java.util.Vector;
import javax.swing.AbstractCellEditor;
import javax.swing.DefaultCellEditor;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
DefaultTableModel model = new DefaultTableModel(new Object[]{"A", "B", "C", "D"}, 0);
for (int row = 0; row < 10; row++) {
Vector data = new Vector(model.getColumnCount());
for (int col = 0; col < model.getColumnCount(); col++) {
data.add(row + "x" + col);
}
model.addRow(data);
}
JTable table = new JTable(model);
table.setDefaultEditor(Object.class, CleanCellEditor.make());
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public static class CleanCellEditor extends DefaultCellEditor {
public static CleanCellEditor make() {
JTextField field = new JTextField();
field.setBorder(null);
System.out.println("make");
return new CleanCellEditor(field);
}
public CleanCellEditor(JTextField textField) {
super(textField);
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
return super.getTableCellEditorComponent(table, null, isSelected, row, column);
}
}
}
我想要达到的效果是:每次用户开始编辑 table 中的单元格时,我希望单元格的文本擦除原来存在的任何文本('Start Editing' 部分),如果没有添加新文本,则将文本设置为原始文本 ('Stop Editing')
在我看来,我错误地假设 setValueAt 会更改当前正在编辑的单元格中的文本 - 相反,它似乎只会在编辑完成后更改单元格的值(这意味着我可能根本不需要放在 'Stop Editing' 下的代码)
但是,如果确实如此,我不知道如何编辑当前正在编辑的单元格中的文本,所以这是我的问题:如何更改当前正在编辑的单元格中的文本?
例如,当我开始编辑 'Test bb,' 时,单元格变为没有文本:
这是我的代码:
private void tblEntriesPropertyChange(java.beans.PropertyChangeEvent evt) {
swb.tablePropertyChange(tblEntries, evt);
}
public void tablePropertyChange(JTable jtable, PropertyChangeEvent evt) {
TableModel mdl = jtable.getModel();
int c = jtable.getSelectedColumn();
int r = jtable.getSelectedRow();
if (r >= 0 && c >= 0) {
String text = mdl.getValueAt(r, c) + "";
if (evt.getNewValue() == null) {
System.out.println("Stop Editing");
String newText = mdl.getValueAt(r, c) + "";
if (newText.length() <= 0) {
jtable.setValueAt(text, r, c); // also tried: mdl.setValueAt(text, r, c);
}
} else {
System.out.println("Start Editing");
jtable.setValueAt("", r, c); // also tried: mdl.setValueAt("", r, c);
}
}
}
在这种过程中尝试 "intervene" 可能是一个真正的技巧。你有两个基本的选择。您可以创建自定义 JTable
实现并确保将 null
之类的内容传递给任何激活的编辑器,这会锁定您一次使用 JTable
,或者您可以提供自己的编辑.
public class CleanCellEditor extends DefaultCellEditor {
public static CleanCellEditor make() {
JTextField field = new JTextField();
field.setBorder(null);
System.out.println("make");
return new CleanCellEditor(field);
}
public CleanCellEditor(JTextField textField) {
super(textField);
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
return super.getTableCellEditorComponent(table, null, isSelected, row, column);
}
}
虽然这稍微好一点,但事实上您可以将它应用于 JTable
的任何实现,这确实意味着您需要为所有可能的 values/types 创建一个 table 可能需要支持
作为一个基本示例...
import java.awt.Component;
import java.awt.EventQueue;
import java.util.Vector;
import javax.swing.AbstractCellEditor;
import javax.swing.DefaultCellEditor;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import javax.swing.table.TableCellEditor;
import javax.swing.table.TableColumn;
import javax.swing.table.TableColumnModel;
public class Test {
public static void main(String[] args) {
new Test();
}
public Test() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
DefaultTableModel model = new DefaultTableModel(new Object[]{"A", "B", "C", "D"}, 0);
for (int row = 0; row < 10; row++) {
Vector data = new Vector(model.getColumnCount());
for (int col = 0; col < model.getColumnCount(); col++) {
data.add(row + "x" + col);
}
model.addRow(data);
}
JTable table = new JTable(model);
table.setDefaultEditor(Object.class, CleanCellEditor.make());
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new JScrollPane(table));
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public static class CleanCellEditor extends DefaultCellEditor {
public static CleanCellEditor make() {
JTextField field = new JTextField();
field.setBorder(null);
System.out.println("make");
return new CleanCellEditor(field);
}
public CleanCellEditor(JTextField textField) {
super(textField);
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
return super.getTableCellEditorComponent(table, null, isSelected, row, column);
}
}
}