# setMnemonic will nicht...



## DataFox (6. Januar 2008)

Hi Java-Profis!

Ich kriegs nicht gebacken meinem Taschenrechner beizubringen, das er auch auf Tastatureingaben hört.

Ich habe eine Klasse für das Zahlen-Tastenfeld von 0 bis 9, welche die einzelnen Tasten generiert. Dem Konstruktor wird ein int übergeben, das _num_ heisst.

Vereinfacht:

```
public class NumFieldButton extends JButton {
		
	public NumFieldButton(int num) {
		this.setText(String.valueOf(num));
		this.setFont(new Font("System", Font.BOLD, 20));
		
		char test = '1';
		if(num == 1) {
			this.setMnemonic(test);
		}
		
	}
		
}
```

setMnemonic erwartet doch einen char, richtig? Eine Fehlermeldung bekomme ich nicht, aber wenn ich hier die 1 drücke passiert nichts. Ich habe auch schon probiert:


```
this.setMnemonic((char)(num));
```

und 


```
this.setMnemonic((char)num);
```

Kanns sein das setMnemonic obsolete ist
denn das hier tut auch nix:


```
if(num == 1) {
this.setMnemonic(java.awt.event.KeyEvent.VK_M);
}
```

drücke M und nix passiert. Gibts da noch eine andere Möglichkeit wie man Tastatureingaben abfragen und dann entsprechend einen Tastendruck im Taschenrechner-Programm auslösen kann?

freue mich über jeden Tipp!

Gruß
Laura


----------



## MeinerEiner_80 (6. Januar 2008)

Moin!
Ein Blick in die API verrät doch ganz klar, wieso es nicht funktioniert... Ich zitiere:


> Sets the keyboard mnemonic on the current model.  The mnemonic is the key which when combined with the look and feel's  mouseless *modifier (usually Alt)* will activate this button  if focus is contained somewhere within this button's ancestor   window.



Für die Shortcuts könntest du zum Beispiel so etwas machen:

```
KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_1 0);
theButton.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(stroke, "doClick");
theButton.getActionMap().put("doClick", yourAction);
```
wobei jetzt yourAction ein Action Object ist...

*grüssle*
MeinerEiner


PS: setMenomic(char c) ist auch tatsächlich obsolent.. zumindest mal seit Java 1.6 oder gar schon früher.. Erwartet wird nun ein Integer..


----------



## DataFox (6. Januar 2008)

oha das sieht ja willd aus 


```
KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_1 0);
```

-> was ist _KeyEvent.VK_1 0_ (wozu die 0?)

Eclipse meint da muss noch nen Komma rein: also VK_1, 0

Habs gerade mal eingebaut:


```
public class NumFieldButton extends JButton {
		
	public NumFieldButton(int num) {
		this.setText(String.valueOf(num));
		this.setFont(new Font("System", Font.BOLD, 20));
		
		KeyStroke stroke = KeyStroke.getKeyStroke(num, 0);
		this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(stroke, "doClick");
		this.getActionMap().put("doClick", new numButtonActionListener());
		
		
		this.addActionListener(new numButtonActionListener());
	}
	
	class numButtonActionListener implements ActionListener {
		public void actionPerformed(ActionEvent e) {
			MyCalc.getMyCalcWindow().getInputField().add(e.getActionCommand());
		}
	}
		
}
```

Error: The method put(Object, Action) in the type ActionMap is not applicable for the arguments (String, NumFieldButton.numButtonActionListener)

glaube ich hab den Action-Parameter noch net geschnallt...(?)

mit dem setMnemonic dingern hab ich auch die Alt-Taste und Focus ausprobiert, aber da kommt grundsätzlich nix an. Seltsam... (auch nicht wenn ich ein int übergebe)

Gruß
Laura


----------



## MeinerEiner_80 (6. Januar 2008)

DataFox hat gesagt.:


> ```
> KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_1 0);
> ```
> -> was ist _KeyEvent.VK_1 0_ (wozu die 0?)
> ...



Ja, so wars auch gedacht..
 Was das andere angeht... ändere es mal wie folgt...

```
public class NumFieldButton extends JButton {
        
    public NumFieldButton(int num) {
        this.setText(String.valueOf(num));
        this.setFont(new Font("System", Font.BOLD, 20));
        
        KeyStroke stroke = KeyStroke.getKeyStroke(num, 0);
        this.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW).put(stroke,"doClick");

                NumAction action = new NumAction();
                this.getActionMap().put("doClick", action);
        
        
        this.setAction(action);
    }
    
    class NumAction extends AbstractAction {
        public void actionPerformed(ActionEvent e) {
            System.out.println("test");
        }
    }
```

*grüssle*
MeinerEiner


----------



## DataFox (6. Januar 2008)

Hi

wenn ich das so mache sind die Buttons leer (keine Zahlen drauf) und es t nix (?)

Gruß
Laura


----------



## MeinerEiner_80 (7. Januar 2008)

Moin!
Also das funktioniert bei mir tadellos... merkwürdig..
Hätte allerdings auch noch ne Version anzubieten... vielleicht klappt das bei dir besser...

```
import java.awt.DefaultKeyboardFocusManager;
import java.awt.Font;
import java.awt.KeyboardFocusManager;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;
import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.KeyStroke;
public class NumFieldButton extends JButton {
    
    private int num = 0;
    public NumFieldButton(int num) {
        this.num = num;
        this.setText(String.valueOf(num));
        this.setFont(new Font("System", Font.BOLD, 20));
        KeyboardFocusManager kbfm = KeyboardFocusManager.getCurrentKeyboardFocusManager();
        kbfm.addKeyEventDispatcher(new NumfieldKeyManager());
        
    }
    
    
    
    class NumfieldKeyManager extends DefaultKeyboardFocusManager {
        
        public boolean dispatchKeyEvent(KeyEvent e) {
            if (e.getKeyCode() ==KeyEvent.VK_0+num && e.getID() == KeyEvent.KEY_RELEASED) {
                System.out.println("test");
                return true;
            }
            return super.dispatchKeyEvent(e);
        }
        
        
    }
    
}
```

*grüssle*
MeinerEiner


----------

