Как выбрать строку таблицы одним щелчком мыши с помощью пользовательского TableCellEditor? - PullRequest
2 голосов
/ 03 января 2012

У меня есть JTable с пользовательским TableCellRenderer и пользовательским TableCellEditor.По умолчанию первый щелчок по строке таблицы переключается с рендерер на редактор и второй щелчок выбирает строку.

Есть ликак сделать выделение строки одним щелчком мыши (и в редакторе)?

Я пытался использовать:

table.getSelectionModel().setSelectionInterval(row, row);

в моем getTableCellEditorComponent но это не работает, и если я добавляю его к своему getTableCellRendererComponent, оно работает, но только иногда.

Вот полный пример:

public class SelectRowDemo extends JFrame {

    public SelectRowDemo() {
        CellRendererAndEditor rendererAndEditor = new CellRendererAndEditor();
        StringTableModel model = new StringTableModel();
        JTable table = new JTable(model);
        table.setDefaultEditor(String.class, rendererAndEditor);
        table.setDefaultRenderer(String.class, rendererAndEditor);

        model.addElement("");
        model.addElement("");
        model.addElement("");

        add(new JScrollPane(table));
        pack();
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel("javax.swing.plaf.nimbus.NimbusLookAndFeel");
                } catch (Exception e) {
                    e.printStackTrace();
                }

                new SelectRowDemo();
            }

        });
    }

    class CellRendererAndEditor extends AbstractCellEditor implements TableCellEditor, TableCellRenderer {

        private final JLabel renderer = new JLabel();
        private final JLabel editor = new JLabel();

        @Override
        public Object getCellEditorValue() {
            return editor.getText();
        }

        @Override
        public Component getTableCellRendererComponent(JTable table, Object value,
                boolean isSelected, boolean hasFocus, int row, int column) {

            String str = "renderer ";
            str += (isSelected) ? "selected" : "not selected";

            renderer.setText(str);
            return renderer;
        }

        @Override
        public Component getTableCellEditorComponent(JTable table, Object value,
                boolean isSelected, int row, int column) {

            table.getSelectionModel().setSelectionInterval(row, row);

            String str = "editor ";
            str += (isSelected) ? "selected" : "not selected";

            editor.setText(str);
            return editor;
        }

    }

    class StringTableModel extends AbstractTableModel {

        private final List<String> data = new ArrayList<String>();

        @Override
        public int getColumnCount() {
            return 1;
        }

        @Override
        public int getRowCount() {
            return data.size();
        }

        @Override
        public Object getValueAt(int row, int column) {
            return data.get(row);
        }

        @Override
        public Class<?> getColumnClass(int column) {
            return String.class;
        }

        @Override
        public boolean isCellEditable(int row, int column) {
            return true;
        }

        @Override
        public void setValueAt(Object aValue, int row, int column) {
            if(aValue instanceof String) {
                data.set(row, (String)aValue);
                fireTableRowsUpdated(row, column);
            } else throw new IllegalStateException("aValue is not a String");
        }

        public void addElement(String s) {
            data.add(s);
        }

    }

}

1 Ответ

2 голосов
/ 03 января 2012

Происходит следующее: пользовательский интерфейс таблицы начинает редактировать ячейку перед изменением выбора.Если вы помещаете println в getTableCellEditor () и shouldSelectCell (), сначала вызывается редактор с isSelected == false, затем он вызывает shouldSelectCell и изменяет выбор.

Вы можете точно видеть, где это происходит в BasicTableUI.adjustSelection (MouseEvent).

  boolean dragEnabled = table.getDragEnabled();

            if (!dragEnabled && !isFileList && table.editCellAt(pressedRow, pressedCol, e)) {
                setDispatchComponent(e);
                repostEvent(e);
            }

            CellEditor editor = table.getCellEditor();
            if (dragEnabled || editor == null || editor.shouldSelectCell(e)) {
                table.changeSelection(pressedRow, pressedCol, 
                        BasicGraphicsUtils.isMenuShortcutKeyDown(e), 
                        e.isShiftDown());
            }

Что касается целей рендеринга, я бы просто отобразил его, как будто selected == true, поскольку это произойдет до завершения обработки этого события.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...