Меня попросили отредактировать настольное приложение Java, разработанное другими. Я никогда раньше не работал над настольным Java-приложением.
Есть JTable, и я должен запретить пользователю выполнять CTRL+С и копировать значение ячейки. Я сделал это.
Проблема в том, что когда пользователь дважды щелкает ячейку и появляется курсор (как вы можете видеть на картинке)
Я не могу запретить пользователю делать CTRL+C. Как мне это сделать?
Уберите их клавиатуру!
Хорошо, это может быть проблематично. Если вам не нужны пользователи для редактирования таблицы, вы можете попробовать сделать таблицу нередактируемой. Вместо того, чтобы повторять один из многих примеров по этому поводу, я оставлю вам это руководство как это сделать и вопрос StackOverflow о том, как Отключить редактирование пользователя в JTable .
В качестве альтернативы вы можете изучить переопределение привязок клавиш. Я никогда не делал этого лично, поэтому я оставляю вам связь или два и вопрос StackOverflow на Привязки клавиш JTable.
Вы также можете сделать что-то умное, обратившись к системному буферу обмена из java.awt.toolkit. Может быть, когда пользователь редактирует ячейку, его буфер обмена устанавливается на пустую строку или (если вы не хотите, чтобы люди редактировали ячейки, но не пытались их скопировать), вы могли бы объединить это с сочетаниями клавиш, чтобы они думают, что они копируют данные, но в итоге вставляют «Извините, копирование в этом приложении запрещено».
Надеюсь, здесь что-то работает.
The problem is that when the user double clicks a cell and the cursor appears
Фокус больше не на JTable. Он находится в редакторе ячейки, которая является JTextField. Поэтому вам нужно удалить функцию копирования текстового поля.
Вы делаете это, удаляя привязку клавиш для «Control C» в текстовом поле:
DefaultCellEditor editor = (DefaultCellEditor)table.getDefaultEditor(Object.class);
JTextField textField = (JTextField)editor.getComponent();
InputMap im = textField.getInputMap();
im.put(KeyStroke.getKeyStroke("control C"), "none");
Вам нужно будет сделать это для каждого типа редактора, который есть в вашей таблице. Например, если у вас есть целочисленные значения, вам нужно будет получить редактор для Integer.class
и также удалить привязку его ключа.
Обратите внимание, что тот же подход можно использовать для таблицы, за исключением того, что для таблицы используется следующий InputMap:
InputMap im = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);