Необходимо оставить некоторые столбцы редактируемыми и недоступными для редактирования и разрешить редактирование ячейки только двойным щелчком по ячейке.

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

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


person Ashish Pancholi    schedule 02.04.2012    source источник


Ответы (2)


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();
            }
        });
    }
}
person mKorbel    schedule 02.04.2012
comment
@kleopatra спасибо, вот в чем вопрос, что действительно полезно для здоровья в этом мире, хммм... Я понял 1-го числа. место смех, потом так долго ничего только кучи гадости и на 2-м. место нутелла??? или...., может быть, трудно решить :-) - person mKorbel; 02.04.2012
comment
@mKorbel Спасибо. Редактирование ограничено только щелчком мыши, извините, как я и просил, но если пользователь начинает вводить текст с помощью клавиатуры, ячейка таблицы позволяет ему это делать. Можем ли мы также ограничить его для редактирования с помощью клавиатуры, если только он не дважды щелкнет ячейку. - person Ashish Pancholi; 02.04.2012
comment
@Ashish Pancholi, клавиша F2 о startCellEditing (поместите информацию об этом во всплывающую подсказку), может быть, так :-), я думаю, что это ерунда, удалить MouseListener из Cell, тогда лучше было бы изменить editor.setClickCountToStart (int); до 10???, 20???, 50???, хе-хе-хе, но я знаю нескольких пользователей, которые могут навязать это ограничение, - person mKorbel; 02.04.2012
comment
@mKorbel Я не понял вашего комментария, но принимаю ваш ответ, потому что вы решили мою проблему. Мне действительно нужно - если пользователь начинает нажимать клавиши, то таблица ищет для него соответствующий текст, а если пользователь дважды щелкает ячейку, то таблица позволяет ему редактировать текст. - Является ли это возможным ? Пожалуйста помоги. Спасибо - person Ashish Pancholi; 02.04.2012
comment
@Ashish Pancholi, пожалуйста, прежде чем что-либо, есть шанс, что вы отредактируете свой вопрос с помощью SSCCE или начнете новый вопрос, потому что, возможно, есть / есть проблемы с бизнесом или логические проблемы, потому что ваш последний комментарий не о дружественном к пользователю способе, может быть Я ошибаюсь, код с прикрепленным изображением - лучший способ.... - person mKorbel; 02.04.2012
comment
@mKorbel stackoverflow.com/questions/9975339/ - person Ashish Pancholi; 02.04.2012

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

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

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

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

person Thomas    schedule 02.04.2012