# Tastenkombinationen überschreiben



## GS_Unnamed (11. Sep 2012)

Hallo zusammen

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?

Gruss
GSU


----------



## Michael... (11. Sep 2012)

Mit 
	
	
	
	





```
frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
```
 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.

```
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", new AbstractAction() {
		public void actionPerformed(ActionEvent e) {
			//nothing to do
		}
	});
```
Evtl. gibt es auch elegantere Lösungen...


----------



## Mujahiddin (11. Sep 2012)

@Michael das klappt nicht so ganz.
JFrames haben generell keine InputMap.
Du kannst aber folgendes machen:


```
public static void deactivateKeyStrokeForJFrame(final JFrame frame, final KeyStroke keyStroke) {
	KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher( new KeyEventDispatcher() {
		
		@Override
		public boolean dispatchKeyEvent(KeyEvent e) {
			if( KeyStroke.getKeyStrokeForEvent( e ).equals( keyStroke ) && ( frame == e.getComponent() || frame.isAncestorOf( e.getComponent() ) ) )
				return true;
			return false;
		}
	} );
}

public static void deactivateKeyStrokeForJComponent(final JComponent component, final KeyStroke keyStroke) {
	KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher( new KeyEventDispatcher() {
		
		@Override
		public boolean dispatchKeyEvent(KeyEvent e) {
			if( KeyStroke.getKeyStrokeForEvent( e ).equals( keyStroke ) && component == e.getComponent() )
				return true;
			return false;
		}
	} );
}

public static void deactivateKeyStrokeForApplication(final KeyStroke keyStroke) {
	KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher( new KeyEventDispatcher() {
		
		@Override
		public boolean dispatchKeyEvent(KeyEvent e) {
			if( KeyStroke.getKeyStrokeForEvent( e ).equals( keyStroke ) )
				return true;
			return false;
		}
	} );
}
```

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:


```
public static void main(String... args) throws Exception {
	JFrame frame = new JFrame();
	// 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 );
}
```


----------



## GS_Unnamed (11. Sep 2012)

Vielen Danke für die Antwort ich werde das ausprobieren


----------

