我正在尝试实现一个必须遵守以下规则的JTable:
我有一个扩展JTable的FileTable。在它的构造函数中,我有以下几行:
getColumnModel().getColumn(2).setCellEditor(new FileTableCellEditor());
addMouseListener(new MouseAdapter(){
public void mouseClicked(MouseEvent e){
if (e.getClickCount() == 2){
int row = rowAtPoint(e.getPoint());
editCellAt(row, 2);
}
}
} );
我的FileTableCell编辑器如下:
public class FileTableCellEditor extends DefaultCellEditor {
public FileTableCellEditor() {
super(new JTextField());
}
@Override
public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
final JTextField ec = (JTextField) editorComponent;
String textValue = (String)value;
ec.setText(textValue);
SwingUtilities.invokeLater( new Runnable() {
@Override
public void run() {
ec.selectAll();
}
});
return editorComponent;
}
}
我的问题是,当我双击不在第3列的单元格时,在第3列上编辑的文本不会突出显示为选定文本。
picture http://www.nispahit.com/stack/tableNotHighlight.png
这对我来说很奇怪,因为我知道文本是被选中。当我写东西时,它会删除之前在该单元格中的文本。它不是选择的。 奇怪的是,当我双击第3列单元格时,它 突出显示选择。
picture http://www.nispahit.com/stack/tableHighlight.png
有人可以倒一些光吗?
谢谢!
答案 0 :(得分:3)
您可以尝试Table Select All Editor方法。不要忘记查看Table Select All Renderer
。
答案 1 :(得分:2)
您的JTextField
未突出显示所选内容,因为它没有聚焦。只需在ec.requestFocus();
之后添加ec.selectAll();
即可。然后它按预期工作。
说明:当您单击可编辑列时,Swing将开始单元格编辑(独立于双击侦听器)并将启动事件转发给组件。因此,JTextField
会收到一次点击,并会请求关注。当您单击其他列时,只有MouseListener
启动单元格编辑,并且不会转发该事件。 (转发事件无论如何都无济于事,因为点击位于文本字段之外。)因此您必须手动请求焦点。