Java Swing: как предотвратить системное копирование, вырезание, вставку действий? - PullRequest
3 голосов
/ 30 ноября 2011

Поэтому я пытаюсь запретить пользователю использовать системные действия по умолчанию, нажимая control + C, control + X, control + V.

Я хочу где-нибудь внутри этой конкретной полосы прокрутки поймать ключ. Панель scrollPane загружает Компонент в себя, например, JLabel.

scrollPane.addKeyListener(new KeyListener(){
    @Override
    public void keyPressed(KeyEvent evt) {
        if (evt.isControlDown() && evt.getKeyCode() == KeyEvent.VK_C) {
                System.out.println("disabled");
        } else if (evt.isControlDown() && evt.getKeyCode() == KeyEvent.VK_X) {
               System.out.println("disabled");
        } else if (evt.isControlDown() && evt.getKeyCode() == KeyEvent.VK_V) {
               System.out.println("disabled");
        }
    }

    @Override
    public void keyReleased(KeyEvent arg0) {
        // TODO Auto-generated method stub
    }

    @Override
    public void keyTyped(KeyEvent arg0) {
        // TODO Auto-generated method stub
    }
});

Однако ничего не печатается.

Я добавил тот же кейлист в Jtree, но он работает для этого.

UPDATE:

Итак, используя привязки клавиш, как заставить JoptionPane появляться?

  scrollPane.getInputMap(JComponent.WHEN_FOCUSED)
                        .put(KeyStroke.getKeyStroke(KeyEvent.VK_C, KeyEvent.CTRL_DOWN_MASK), 
                                JOptionPane.showMessageDialog(null, "disabled"));

Ответы [ 3 ]

5 голосов
/ 30 ноября 2011

лучше было бы реализовать KeyBindings вместо KeyListener , потому что

1) KeyListener работает только тогда, когда JComponent имеет Focus в окне,

2) вы устанавливаете KeyListener на JScrollPane вместо JTree

3) для KeyBindings вы можете установить InputMap и ActionMap для

  • в контейнер верхнего уровня (JFrame, JDialog, JWindow)

  • бетон JComponent (s)

4) для KeyListener и KeyBindings этот контейнер верхнего уровня должен иметь фокус на экране

5) затем вы можете установить для требуемого event(s)#consume();

4 голосов
/ 30 ноября 2011

Вы должны прикрепить свой пользовательский TransferHandler, который будет переопределять getCutAction и getCopyAction ко всем экземплярам JComponent, которые вы хотите предотвратить копированием / вставкой пользователем.

Пожалуйста, посмотрите здесь детали: http://docs.oracle.com/javase/1.5.0/docs/guide/swing/1.4/dnd.html#ClipboardTransferSupport

3 голосов
/ 30 ноября 2011

Использовать привязки клавиш http://docs.oracle.com/javase/tutorial/uiswing/misc/keybinding.html

...