有没有办法在没有CellEditor的情况下选择JTable中单元格中的所有文本?

时间:2016-07-15 15:57:30

标签: java swing jtable

简短版本:给定一个带有扩展DefaultTableModel的TableModel的JTable,我可以在不使用CellEditor的情况下使用类String选择单元格中的所有文本吗?

长版本:我已经创建了一个扩展DefaultTableModel的TableModel,并且只能选择可编辑的行。以下是相关部分:

class MyTableModel extends DefaultTableModel {

    private List<String> columnNames;
    private List<List<String>> strings;

    /** editable stores the columns which we're allowed to change */
    private List<Integer> editable;

    public MyTableModel (List<String> columnNames, List<List<String>> 
            strings, List<Integer> editable) {
        this.columnNames = columnNames;
        this.strings = strings;
        this.editable = editable;
    }

    public Object getValueAt(int row, int col) {
        return strings.get(col).get(row);
        return null;
    }

    public void setValueAt(Object value, int row, int col) {
        strings.get(col).set(row, (String) value);
        fireTableCellUpdated(row, col);
    }

    public boolean isCellEditable(int row, int col) {
        return canEdit(col);
    }

    /**
     * This method looks like it should be lumped into isCellEditable()
     * But there's unique behavior I plan on having later for the first
     * column and this will let my code down the road be much cleaner.
     **/ 
    public boolean canEdit(int col) {
        return col != 0 && editable.indexOf(col) != -1;
    }
}

据了解,DefaultTableModel将使用Strings填充的单元格视为JTextFields。我们对此表的使用是用两列填充它。带有文件名(如字符串)的不可编辑列,后跟可编辑的空字符串列。当选择一个可编辑的单元格时,我希望它将文本设置为它之前的文本文本,然后选择所有文本(稍后用户执行一个命令,每个文件都有一个可选的字符串字段,所以如果文件名是关联的可编辑单元格不为空,它使用该值。我们不希望用户每次设置时都必须重新键入整个文件名,但是如果他们愿意,也希望能够让他们快速执行此操作。)

该表有一个MouseListener,可以看到是否单击了一个可编辑的单元格,如果是,它还会在其前面填入文件名称的单元格。

table.addMouseListener(new MouseAdapter() {
    public void mouseReleased(MouseEvent e) {       
        JTable table = ((JTable) e.getSource());
        MyTableModel model = (MyTableModel)table.getModel();
        int row = table.rowAtPoint(e.getPoint());
        int col = table.columnAtPoint(e.getPoint());

        if(tableModel.canEdit(col))
            tableModel.setValueAt(
                tableModel.getValueAt(row, col - 1), row, col);
    }
});

这很好用,但是我无法选择文本。我似乎无法找到一个返回单元格组件的方法,并且我添加了一个我在网上找到的CellEditor,但它没有改变任何东西。

class MyCellEditor extends DefaultCellEditor {

    public MyCellEditor(JTextField textField) {
        super(textField);

        textField.addFocusListener(new FocusAdapter()  {
            public void focusGained(FocusEvent e ) {
                textField.selectAll();
            }
        });
    }
}

添加到表中:

for(int i = 0; i < table.getRowCount(); i++)
    table.setCellEditor(new MyCellEditor(new
              JTextField((String)table.getValueAt(i, 2))));

如果有一种方法可以完全省略CellEditor,事情就会容易得多,但是如果我做的事情就像搞砸了这些听众处理事件的顺序,我不介意包含它。我想要避免的是需要编写一些巨大的CellEditor或大规模检修任何代码只是为了增加一点点便利。

1 个答案:

答案 0 :(得分:3)

尝试将selectAll()语句包装在SwingUtilities.invokeLater(...)

请参阅:how do I simulate "onStartCellEditing" for DefaultCellEditor

有关在启动单元格编辑时在任何单元格中选择文本的一般示例: