2

我正在尝试实现一个必须遵守以下规则的 JTable:

  1. 只能编辑第 3 列的单元格。
  2. 双击 X 行中的任何单元格时,X 行的第 3 列将开始编辑。
  3. 每当开始编辑单元格时,其中的文本将被选中。

我有一个扩展 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 列上编辑的文本未突出显示为选定文本。

图片 http://www.nispahit.com/stack/tableNotHighlight.png

这对我来说很奇怪,因为我知道文本选中。当我写东西时,它会删除该单元格中的文本。它只是没有选择什么。奇怪的是,当我双击第三列单元格本身时,它确实突出显示了选择。

图片 http://www.nispahit.com/stack/tableHighlight.png

有人可以倒一些光吗?

谢谢!

4

2 回答 2

3

您可以尝试表全选编辑器方法。不要忘记查看Table Select All Renderer.

于 2013-09-26T14:02:27.310 回答
2

JTextField没有突出显示选择,因为它没有集中。只需在ec.requestFocus();之后添加一个ec.selectAll();。然后它按预期工作。

说明:当您单击可编辑列时,Swing 将开始单元格编辑(独立于您的双击侦听器)并将启动事件转发给组件。所以JTextField接收到点击并会请求焦点。当您单击不同的列时,只有您MouseListener启动单元格编辑,并且该事件不会被转发。(转发事件无论如何都无济于事,因为点击在文本字段之外。)所以你必须手动请求焦点。

于 2013-09-27T09:01:05.137 回答