双击单元格时,默认情况下JTable单元格处于追加模式。 有没有办法让单元格默认为覆盖模式,IOW,选择单元格的内容,这样如果用户开始输入旧文本将被新文本替换,而不必手动擦除它?
答案 0 :(得分:4)
您应该可以通过创建自己的TableCellEditor来执行此操作,可以使用setCellEditor()将其分配给父表。该对象是JTable在用户开始编辑单元格时调用的工厂,用于创建用于执行实际编辑的字段。您可以返回自己的JTextField,只需避免设置旧值即可实现您的要求。您还必须在文本字段中附加一个侦听器,以便在用户输入完成后更新表中的值。
答案 1 :(得分:3)
您可能会发现Table Select All Editor有帮助。
答案 2 :(得分:2)
我已经实现了以下方法[addDeletePreviousOnEditBehavior],工作正常!请注意,您需要使用一些TableCellEditor。为此,请添加以下代码:
JTable table=new JTable();
JTextField field=new JTextField();
addDeletePreviousOnEditBehavior(field);
table.setCellEditor(new DefaultCellEditor(field));
方法是:
public static void addDeletePreviousOnEditBehavior(final JComponent field) {
field.addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent fe) {
field.putClientProperty(DELETE_ON_EDIT, true);
}
@Override
public void focusLost(FocusEvent fe) {
}
});
field.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent ke) {
}
@Override
public void keyPressed(KeyEvent ke) {
if ((!(ke.isActionKey()
|| isSpecial(ke.getKeyCode())))
&& ((Boolean) field.getClientProperty(DELETE_ON_EDIT))) {
System.out.println("Key:" + ke.getKeyCode() + "/" + ke.getKeyChar());
field.putClientProperty(DELETE_ON_EDIT, false);
if (field instanceof JFormattedTextField) {
((JFormattedTextField) field).setValue(null);
}
if (field instanceof JTextComponent) {
((JTextComponent) field).setText(null);
}
}
}
@Override
public void keyReleased(KeyEvent ke) {
// do nothing
}
});
}