1

在我的JTable. 我必须保持一些列可编辑和一些列不可编辑,所以我有覆盖isCellEditable-

@Override
public boolean isCellEditable(int row, int col) {
    if (col == uneditableColumn) {
        return false;
    }
    return bEdit;
}

现在我的要求是只允许在双击时编辑单元格,即如果用户双击单元格,那么只有它进入可编辑模式。为此-我将不得不自己制作CellEditor并覆盖。

public boolean isCellEditable( EventObject e )

有人可以建议是否可以使用 -

public boolean isCellEditable(int row, int col) 

请帮忙 -

4

2 回答 2

3

好吧,我不会覆盖isCellEditable(...)JTable而是提供自定义表模型。

从 JavaDoc 开始JTable#isCellEditable(...)

该列是在表格视图的显示顺序中指定的,而不是在 TableModel 的列顺序中。这是一个重要的区别,因为当用户重新排列表中的列时,视图中给定索引处的列将会改变。同时,用户的操作永远不会影响模型的列顺序。

此外,该单元格似乎可以对表格进行编辑,但编辑器本身可能不提供输入字段,直到它被双击。如果您想一次只编辑一个单元格,您也可以将该信息存储在模型中并让编辑人员检查。

于 2012-04-02T07:57:29.520 回答
3
is to allow edit the cell only on Double click i.e. if user double clicks 
on cell then only it comes into editable mode.

你看看DefaultCellEditor#clickCountToStart

对于 CellEditor 或方法覆盖 isCellEditable (AbstractTableModel)

@Override
public boolean isCellEditable(EventObject anEvent) {
    if (anEvent instanceof MouseEvent) {
        return ((MouseEvent) anEvent).getClickCount() >= clickCountToStart;
    }
    return true;
}

对于 DefaultTableModel 可能是

import javax.swing.*;
import javax.swing.UIManager.LookAndFeelInfo;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.*;

public class EditorRendererClickCountToStart {

    public EditorRendererClickCountToStart() {
        TableModel model = new DefaultTableModel(new Object[][]{
                    {"A", "Item 0"}, {"B", "Item 1"}, {"C", "Item 2"},
                    {"D", "Item 3"}, {"E", "Item 4"}}, new String[]{"TextField", "Combo"});
        JTable table = new JTable(model);
        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
        DefaultCellEditor editor = new DefaultCellEditor(new JComboBox(new Object[]{
                    "Item 0", "Item 1", "Item 2", "Item 3", "Item 4"}));
        editor.setClickCountToStart(2);
        table.getColumnModel().getColumn(1).setCellEditor(editor);
        table.setPreferredScrollableViewportSize(table.getPreferredSize());
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JScrollPane(table));
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        try {
            for (LookAndFeelInfo info : UIManager.getInstalledLookAndFeels()) {
                System.out.println(info.getName());
                if ("Nimbus".equals(info.getName())) {
                    UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (UnsupportedLookAndFeelException e) {// handle exception
        } catch (ClassNotFoundException e) {// handle exception
        } catch (InstantiationException e) {// handle exception
        } catch (IllegalAccessException e) {// handle exception
        }
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new EditorRendererClickCountToStart();
            }
        });
    }
}
于 2012-04-02T08:02:17.743 回答