JTextField und KeyStroke Ausgabe

Halli Hallo die Herren

Ich baue mir gerade die Möglichkeit verschiedene Hotkeys zu vergeben welche dann zur Verfügung stehen. Dazu hab ich mir ein Panel mit Textfelder gebaut in denen der Nutzer dann seine Hotkeys eintragen kann. Ganz normal wie man es kennt. Da es keine Ausnahmen geben soll, sind also auch Kombinationen ala STRG+ALT+U oder SHIFT+P möglich.

Nun aber de Frage: Wie krieg ich aus dem KeyEvent bzw. dem KeyStroke die Tastenkombi auf das JTextfield? Für den Anfang reicht erstmal nur der KeyStroke, daraus bau ich mir dann sowas wie "

".
Das Problem besteht nun aber darin das das Event doppelt ausgelöst wird (das tippen und mein listener) und immer irgendwas fehlt. Sprich am Ende steht dann sowas wie “pressed Dd”, “pressed Aa” oder "ctrl pressed " und der buchstabe fehlt

Beispielcode
[spoiler]```JFrame f = new JFrame();
f.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );

	final JTextField tf = new JTextField();
	tf.addKeyListener(new KeyListener(){

		@Override
		public void keyPressed(KeyEvent e) {
			// TODO Auto-generated method stub
			JTextField f = (JTextField) e.getSource();
			f.setText(""+KeyStroke.getKeyStrokeForEvent(e));
		}

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

		@Override
		public void keyTyped(KeyEvent e) {
			// TODO Auto-generated method stub
		}
		
	});
	
	f.add(tf, BorderLayout.NORTH);
	f.pack();
	f.setVisible( true );```[/spoiler]

Die eigtl. Werte, Keytrokes, werden dann zwischengespeichert und dem jeweiligen Element angehangen und aktualisiert wenn sich der Hotkey ändert. Aber für den Nutzer macht es wenig Sinn das er “pressed D” da sieht statt nur “D” z.B. Alternativ Ideen sind natürlich auch willkommen

Hier mal was kleines aus meinem Swing Framework:

Du musst die Dateien alle im gleichen package haben.ggf noch package… In die datei schreiben). Die .properties.java Dateien ind .properties umbenennen(konnte die sonst naemlich nicht hochladen)

Hi, erstmal danke. Aber soweit ich das sehe kommt da genau das gleiche wie bei mir. Geb ich “p” ein, steht dann im Textfeld “+Pp”. Ersteres ist dein “Parser” und letzteres ist die Eingabe an sich “p”.

Ok das ist mir neu. Warte mal ich guck da rüber

Das tut wohl was es soll. danke.

Dennoch blick ich nicht so ganz an welcher Stelle die eigtl. Eingabe “verworfen” wird. Kannst du kurz 1-2 Sätze zu sagen? Denn kopier ich deine Methode in meine ActionListener funktioniert es wieder nicht. Ich vermute mal das da schon zu “spät” ist als das man das Ergebnis noch direkt ändern kann. denn deins ist ja ein eigenes textfeld

Genau. Ich ueberschreibe die processKeyEvent methode von (J)Component. Somit werde ich immer informirrt ob sich da was tut. In der Methode hole ich mir den keyCode(code) und ueberpruefe ob dieser nicht enter oder back space(also loeschen ist). Denn enter kann man als bestaetigen nehmen und back space soll loeschen. Falls dies zutrifft und der key auch noch gedrueckt wird setze ich den neuen KeyStroke und den Text. Falls es back space war loesche ich deb keystroke(=null) und setze den text auf null.

Aber was hindert dich daran anstatt ein JTextField einfach ein JKeyStrokeField zu nehmen und dann einfach mittels getKeyStroke den KeyStroke zu holen? Ist auf jedenfall weniger Arbeit. Denn im Endeffekt versucht du ja nichts anderes mit deiner Implementietung.

Hindern tut mich nichts :smiley: War nur der Infohalber was da genau passiert. Und eventuell gäbe es eine andere „einfachere“ Lösung mit z.B. FormattedText oder sowas. Aber das kann man ja immernoch umbauen wenn es erstmal geht

Was meinst du mit FormattedText?

War ein Beispiel, meinte die FormattedTextField. Aber so wie es jetzt ist scheint es schon elegant zu sein und tut was es soll.

Ahso FormattedTextField :smiley: wusste nicht genau was du meinst…

Jetzt nur noch die ActionMaps gescheit aktualisiert kriegen und alles ist supi :smiley: