Необходимо сохранить некоторые столбцы редактируемыми и не редактируемыми и разрешить редактирование ячейки только при двойном щелчке по ячейке - PullRequest
1 голос
/ 02 апреля 2012

В моей реализации 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) 

Пожалуйста, помогите -

Ответы [ 2 ]

3 голосов
/ 02 апреля 2012
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();
            }
        });
    }
}
3 голосов
/ 02 апреля 2012

Ну, я бы не переопределил isCellEditable(...) в JTable, а скорее предоставил бы пользовательскую модель таблицы.

Из JavaDoc на JTable#isCellEditable(...):

Столбец указывается в порядке отображения табличного представления, а не в порядке столбцов TableModel.Это важное различие, потому что, когда пользователь переставляет столбцы в таблице, столбец с данным индексом в представлении будет меняться.В то же время действия пользователя никогда не влияют на порядок столбцов модели.

Кроме того, ячейка может показаться редактируемой для таблицы, но сам редактор может не предоставлять поля ввода до тех пор, пока по ней дважды не щелкнули.Если вы хотите сделать редактируемой только одну ячейку за раз, вы можете также сохранить эту информацию в модели и позволить редакторам проверить это.

...