setMnemonic will nicht...

DataFox

Erfahrenes Mitglied
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:
Code:
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:

Code:
this.setMnemonic((char)(num));

und

Code:
this.setMnemonic((char)num);

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

Code:
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
 
Zuletzt bearbeitet:
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:
Code:
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..
 
oha das sieht ja willd aus ;)

Code:
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:

Code:
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
 
Zuletzt bearbeitet:
Code:
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

Ja, so wars auch gedacht..
Was das andere angeht... ändere es mal wie folgt...
Code:
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
 
Moin!
Also das funktioniert bei mir tadellos... merkwürdig..
Hätte allerdings auch noch ne Version anzubieten... vielleicht klappt das bei dir besser...
Code:
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
 
Zurück