JTextField.selectAll()工作奇怪

时间:2013-09-26 13:55:14

标签: java swing jtable jtextfield tablecelleditor

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

  1. 只能编辑第3列的单元格。
  2. 当双击行X中的任何单元格时,行X的第3列将开始编辑。
  3. 每当开始编辑单元格时,将选择其中的文本。
  4. 我有一个扩展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

    有人可以倒一些光吗?

    谢谢!

2 个答案:

答案 0 :(得分:3)

您可以尝试Table Select All Editor方法。不要忘记查看Table Select All Renderer

答案 1 :(得分:2)

您的JTextField未突出显示所选内容,因为它没有聚焦。只需在ec.requestFocus();之后添加ec.selectAll();即可。然后它按预期工作。

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