Ich habe jetzt schon einiges mit KeyListener etc. rumprobiert und ich finde es leider nicht heraus, google ist auch nicht besonders hilfreich und die Api hilft mir hier auch nicht ???:L
Windows gibt ja einige Tastenkombination für Programme vor.
Bei einem meiner Programme möchte ich eine dieser Kombinationen überschreiben, damit sie nicht mehr die vorherige Funktion erfüllt.
z.B. ALT+F4 schliesst das Programm
Wie kann ich diese Kombination überschreiben bzw. abstellen?
kann man das schließen des JFrames grundsätzlich (also auch mit ALT F4) verhindern.
Wenn die Einschränkung mit obiger Lösung zu extrem ist. Könnte man auch mit Key Bindings die Input und ActionMap einer Komponente die sich im Frame befindet manipulieren und ins Leere laufen lassen.
Java:
InputMap map = panel.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW);
map.put(KeyStroke.getKeyStroke(KeyEvent.VK_F4,InputEvent.ALT_MASK),"deactivate_ALT_F4");
panel.getActionMap().put("deactivate_ALT_F4",newAbstractAction(){publicvoidactionPerformed(ActionEvent e){//nothing to do}});
@Michael das klappt nicht so ganz.
JFrames haben generell keine InputMap.
Du kannst aber folgendes machen:
Java:
publicstaticvoiddeactivateKeyStrokeForJFrame(finalJFrame frame,finalKeyStroke keyStroke){KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(newKeyEventDispatcher(){@OverridepublicbooleandispatchKeyEvent(KeyEvent e){if(KeyStroke.getKeyStrokeForEvent( e ).equals( keyStroke )&&( frame == e.getComponent()|| frame.isAncestorOf( e.getComponent())))returntrue;returnfalse;}});}publicstaticvoiddeactivateKeyStrokeForJComponent(finalJComponent component,finalKeyStroke keyStroke){KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(newKeyEventDispatcher(){@OverridepublicbooleandispatchKeyEvent(KeyEvent e){if(KeyStroke.getKeyStrokeForEvent( e ).equals( keyStroke )&& component == e.getComponent())returntrue;returnfalse;}});}publicstaticvoiddeactivateKeyStrokeForApplication(finalKeyStroke keyStroke){KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(newKeyEventDispatcher(){@OverridepublicbooleandispatchKeyEvent(KeyEvent e){if(KeyStroke.getKeyStrokeForEvent( e ).equals( keyStroke ))returntrue;returnfalse;}});}
Die erste Methode schaltet den KeyStroke für ein ganzes JFrame aus, also inklusive alle Components, die sich darin befinden.
Die zweite Methode schaltet den KeyStroke für ein einzelnes JComponent aus (z.B. JTextField)
Die dritte Methode schaltet den KeyStroke für die gesamte Applikation aus, also alle JFrames, Components etc.
Du kannst das in etwa folgendermaßen verwenden:
Java:
publicstaticvoidmain(String... args)throwsException{JFrame frame =newJFrame();// JTextField field = new JTextField();// frame.getContentPane().add( field );deactivateKeyStrokeForJFrame( frame,KeyStroke.getKeyStroke(KeyEvent.VK_F4,InputEvent.ALT_DOWN_MASK ));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE );
frame.setSize(200,200);
frame.setVisible(true);}