Swing KeyEvent mit KeyListener und KeyAdapter kürzer schreiben

Alex2013

Bekanntes Mitglied
Hallo Leute,

noch ein kurzes Posting von mir.
In der Java Vorlesung sind wir leider nicht weiter gekommen bzw. wir haben uns bei den EventListenern nur die actionPerformed Methode angeschaut und mit der alle weiteren Maßnahmen absolviert.
Da ich jetzt auch mit Tastatureingaben KeyEvent arbeiten wollte, habe ich ein kleines Programm folgend umgeschrieben:

Weiterer Text folgt unter dem Code

Java:
[code]
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

public class Zahlen_raten_keyevent extends JFrame implements KeyListener
{
	String a="Bitte geben Sie eine Zahl ein: ";
	String b="Ihre Eingabe war zu niedrig";
	String d="Ihre Eingabe war zu groß";
	JButton pruefen,allesLoeschen;
	JLabel anzeige,ausgabe,info;
	JTextField eingabe;
	Container c;
	private static final long serialVersionUID = 1L;
	
	public Zahlen_raten_keyevent(String titel)
	{
		c=getContentPane();
		setLayout(new GridLayout(2,3));
		setSize(850, 200);
		setLocation(200, 200);
		pruefen=new JButton("Prüfen");
		pruefen.addKeyListener(new KeyAdapter() 
		{
			public void keyPressed(KeyEvent ke) 
			{
				if((ke.getKeyCode()==KeyEvent.VK_ENTER)&&(pruefen.isFocusOwner()))//getActionCommand().equals("Prüfen"))&&(eingabe.getText()!=null))
				{
					int zahl2=Integer.parseInt(eingabe.getText());
					if(zahl2<zahl)
					{
						ausgabe.setText(b);
					}
					else if(zahl2>zahl)
					{
						ausgabe.setText(d);
					}
					else if(zahl2==zahl)
					{
						ausgabe.setText("<html>Ihre Eingabe war korrekt! :-) <br><br>Die gesuchte zufällige Zahl<br><br> ist die: "+zahl+"</html>");
					}
					else
					{
						String f="Fehler!";
						JOptionPane.showMessageDialog(null, "Sie müssen erst eine Eingabe tätigen",f,JOptionPane.ERROR_MESSAGE);
					}
				}
			}

		});
		allesLoeschen=new JButton("Clear");
		allesLoeschen.addKeyListener(new KeyAdapter() 
		{
			public void keyPressed(KeyEvent ke)
			{
				if((ke.getKeyCode()==KeyEvent.VK_ENTER)&&(allesLoeschen.isFocusOwner()))//getActionCommand().equals("Clear"))
				{
					eingabe.setText("");
					ausgabe.setText("");
				}
				else if(ke.getKeyCode()==KeyEvent.VK_ESCAPE)
				{
					dispose();
				}
			}
		});
		anzeige=new JLabel("Bitte geben Sie eine Zahl ein: ",JLabel.RIGHT);
		ausgabe=new JLabel();
		ausgabe.setOpaque(true);
		ausgabe.setBackground(Color.WHITE);
		ausgabe.setToolTipText("Hier wird ihre Lösung erscheinen");
		eingabe=new JTextField();
		info=new JLabel("Zufallszahlenraten by Alexander Ropella (c)",JLabel.CENTER);
		c.add(anzeige);
		c.add(eingabe);
		c.add(pruefen);
		c.add(allesLoeschen);
		c.add(ausgabe);
		c.add(info);
		setVisible(true);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) 
	{
		new Zahlen_raten_keyevent("Zahlenraten GUI");
	}
	
	Random rnd = new Random();
	int zahl=rnd.nextInt(101);

	@Override
	public void keyPressed(KeyEvent e) {}	@Override	public void keyReleased(KeyEvent e) {}	@Override	public void keyTyped(KeyEvent e) {}
}
[/code]

Bei der ActionEvent e Methode konnte man die Buttons ja z.B. per e.getActionComman.equals("...") vergleichen und dann eine Fallunterscheidung machen.
Geht das bei den KeyEvents ähnlich?
Kann man die KeyEvents der beiden Knöpfe zusammenfassen und/oder kürzer schreiben oder geht das eher nicht?

Vielen Dank für hilfreiche Antworten :)

noch eine kurze Info: so wie das Programm jetzt aussieht, funktioniert es, daher nur die Frage, ob man den Code anders zusammenfassen oder kürzen kann. Speziell die Buttons.


Lg
 
Zuletzt bearbeitet:

anti-held

Bekanntes Mitglied
schöner schaut es aus wenn du es folgendermaßen schreibst:

Java:
button.addKeyListener(new KeyAdapter() {
			@Override
			public void keyPressed(KeyEvent e) {
				switch (e.getKeyCode()) {
				case KeyEvent.VK_F1:
					JOptionPane.showMessageDialog(ResourcesTest.this, "help");
					break;
				case KeyEvent.VK_F2:
					JOptionPane.showMessageDialog(ResourcesTest.this, "f2");
					break;
				default:
					JOptionPane.showMessageDialog(ResourcesTest.this, e.getKeyChar());
				}
			}
		});

bitte halte dich an Code Conventions.
Klassennamen großschreiben.

Außerdem würde mich fragen, warum du von KeyListener implementierst?
 

Alex2013

Bekanntes Mitglied
Mhm..., habe ich denn nicht alle Klassennamen großgeschrieben?
Soweit ich das sehe schon, sonst werde ich das ändern.

Ich habe KeyListener implementiert, da der Computer doch auf Keys also auf Tastatureinschläge reagieren soll. Und je nachdem welche Taste ich drücke, habe ich das noch einmal unterschieden.
Oder interpretiere ich den KeyListener jetzt falsch und dafür ist der KeyAdapter zuständig?

Lg
 

anti-held

Bekanntes Mitglied
Sry hatte mich vertan...ich meinte Camelcase.
Also ZahlenRatenKeyevent.

Auch die Membervariablen würde ich nicht a,b,c und d nennen.
Aussagekräftige Variablennamen machen dir das Leben bei größeren Programmen
um einiges leichter.

zu dem Implementieren von KeyListener:
Deine Klasse ZahlenRatenKeyevent implementiert KeyListener.
Die Methoden sind aber alle leer.
Ist also sinnlos.
Würde nur Sinn machen, wenn du [c]this.addKeyListener(this);[/c] ausführen würdest und
die Methoden auch füllst.

Nur dem Button hast du einen wirklich implementierten KeyListener übergeben.
Das bedeutet, wenn der Focus auf diesem Button liegt, dann wird die keyPressed()-Methode
des Listeners aufgerufen. Wenn jetzt der Focus z.B. auf einem anderen Programm liegt,
wird nichts ausgeführt.
 

Alex2013

Bekanntes Mitglied
Hättest du einen Tipp oder wüsstest du es evtl. auch konkret, wie ich das umschreiben müsste um auf KeyEreignisse zu reagieren auch wenn der Button zu dem der KeyListener gehört nicht im Fokus ist?

Lg
 

anti-held

Bekanntes Mitglied
Wenn du sowas willst, musst du einen KeyEventDispatcher verwenden.

Hier ein kleines Beispiel:

Java:
import java.awt.BorderLayout;
import java.awt.KeyEventDispatcher;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;

public class ResourcesTest extends JFrame {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	private JButton button = new JButton("b1");
	private JLabel label = new JLabel("text");
	private JButton button2 = new JButton("b2");

	public static void main(String[] args) {
		new ResourcesTest();
	}

	public ResourcesTest() {
		KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {

			public boolean dispatchKeyEvent(KeyEvent e) {
				if (e.getID() == KeyEvent.KEY_PRESSED) {
					switch (e.getKeyCode()) {
					case KeyEvent.VK_F1:
						JOptionPane.showMessageDialog(ResourcesTest.this, "help");
						break;
					case KeyEvent.VK_F2:
						JOptionPane.showMessageDialog(ResourcesTest.this, "f2");
						break;
					default:
						JOptionPane.showMessageDialog(ResourcesTest.this, e.getKeyChar());
					}
				}
				return false;
			}
		});
		getContentPane().add(label, BorderLayout.NORTH);

		getContentPane().add(button, BorderLayout.CENTER);
		getContentPane().add(button2, BorderLayout.SOUTH);
		pack();
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);

	}

}

das [c]e.getID() == KeyEvent.KEY_PRESSED[/c] brauchst du, damit nicht für key_pressed, key_released und key_typed
das Event ausgelöst wird.
 

Alex2013

Bekanntes Mitglied
Super, danke es klappt! :-D

Ich habe das Programm jetzt etwas umgebaut und es funktioniert super!

Mit welchem Buch hast du denn Java gelernt?
Ich bin ja noch nicht sooo weit, sag ich mal, daher habe ich mir fürs erste "Grundkurs Programmieren in Java" zugelegt.
Aber die Behandlung von Objekten wie einem KeyEventDispatcher oder der anderen Objekte die du benutzt hast, habe ich dort noch nicht gesehen.

Mit dem Buch konnte ich bisher allerdings gut lernen. Hast du evtl. eine Empfehlung für weiterführende Lektüre?

Vielen Dank noch mal für deinen Tipp! :)

Lg
 
Zuletzt bearbeitet:

anti-held

Bekanntes Mitglied
Nunja...die Grundlagen habe ich während meines Informatikstudiums gelernt.
Das waren aber leider wirklich nur grundlegende Kenntnisse.

Swing z.B. habe ich mir komplett selbst beigebracht.
Man findet viele Tutorials oder ähnliches im Internet.
(z.B. von Vogella Tutorials)

Ich hatte mir eine CD von Galileo Computing besorgt.
Sie ist sehr anschaulich. Mit Videotutorials kann man super lernen finde ich.

Such dir einfach ein Thema das dir gefällt und versuch es umzusetzen.
Ein kleines Chatprogramm ist sehr empfehlenswert (beinhaltet GUI und Networking).

Immer wenn du Probleme hast, findest du im Internet Beispiele, die ähnliches machen.
Vor allem auf Seiten wie diesem Java-Forum oder Stackoverflow.

Das beste Hilfsmittel eines Javaprogrammierers ist Google.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M KeyEvent ohne Fokus konsumieren AWT, Swing, JavaFX & SWT 1
Monokuma KeyEvent in der Canvas Klasse AWT, Swing, JavaFX & SWT 0
F AWT awt KeyEvent - Zeichen direkt nach Eingabe löschen AWT, Swing, JavaFX & SWT 2
Bluedaishi JavaFX JFoenix TextField KeyEvent AWT, Swing, JavaFX & SWT 2
L JavaFX ASCII Zeichen /char von KeyEvent erhalten AWT, Swing, JavaFX & SWT 5
Wurstkopp JavaFX JavaFX KeyEvent kein Zahlencode um unbekannte Mediatasten auszuwerten? AWT, Swing, JavaFX & SWT 0
B JavaFX Wo liegt mein Gedankenfehler ??? KeyEvent geht nicht ... AWT, Swing, JavaFX & SWT 8
S Swing JDialog mit KeyEvent als Rückgabe AWT, Swing, JavaFX & SWT 1
B JavaFX KeyEvent und Canvas draw Problem AWT, Swing, JavaFX & SWT 9
dat_vin KeyEvent jTextField AWT, Swing, JavaFX & SWT 12
B Event Handling KeyEvent für "+"-Tase auf dem Numpad? AWT, Swing, JavaFX & SWT 2
R Integer to KeyEvent AWT, Swing, JavaFX & SWT 2
sylo STRG + TAB KeyEvent abfangen AWT, Swing, JavaFX & SWT 6
earlgrey_tea KeyEvent reagiert nicht auf Eingabe ("Pausentaste") AWT, Swing, JavaFX & SWT 11
Luk10 KeyEvent ... AWT, Swing, JavaFX & SWT 6
M KeyEvent, KEY_TYPED & backspace/left/right. AWT, Swing, JavaFX & SWT 3
H KeyEvent für JFrame AWT, Swing, JavaFX & SWT 3
S Spezielles KeyEvent AWT, Swing, JavaFX & SWT 6
Luma AWTEventListener KeyEvent und KEY_TYPED AWT, Swing, JavaFX & SWT 5
P KeyEvent methode an actionEvent methode weiterleiten AWT, Swing, JavaFX & SWT 5
A KeyEvent bei TAB-Druck AWT, Swing, JavaFX & SWT 10
J KeyEvent bei JTable mehrmals hintereinander ausführen AWT, Swing, JavaFX & SWT 9
J KeyEvent STRG+l, CTRL_DOWN_MASK AWT, Swing, JavaFX & SWT 7
I Pfeiltasten für KeyEvent AWT, Swing, JavaFX & SWT 4
G Windows Taste in KeyEvent? AWT, Swing, JavaFX & SWT 4
M KeyEvent - Programm mit ESC beenden AWT, Swing, JavaFX & SWT 7
H KeyEvent Leerzeichen und Backspace funktioren nicht! HILFE! AWT, Swing, JavaFX & SWT 2
S KeyEvent im JPanel AWT, Swing, JavaFX & SWT 3
G KeyEvent - Probleme AWT, Swing, JavaFX & SWT 6
G Suche einen KeyEvent für die Taste "ä" AWT, Swing, JavaFX & SWT 7
P JTextfield Text durch Keylistener verändern AWT, Swing, JavaFX & SWT 4
N Keylistener & JComboBox AWT, Swing, JavaFX & SWT 5
B Swing JButton mit KeyListener AWT, Swing, JavaFX & SWT 3
H KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
Fridolin111 Der KeyListener Löst kein event aus AWT, Swing, JavaFX & SWT 6
B KeyListener auf JFrame reagiert nicht AWT, Swing, JavaFX & SWT 8
N Mit KeyListener ein rechteck zeichnen AWT, Swing, JavaFX & SWT 9
S Swing JPanel nimmt keinen KeyListener an AWT, Swing, JavaFX & SWT 7
P JPanel KeyListener hinzufügen AWT, Swing, JavaFX & SWT 8
B Swing KeyListener auf Container? AWT, Swing, JavaFX & SWT 1
T Event Handling KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
K KeyListener ohne JFrame AWT, Swing, JavaFX & SWT 9
C Keylistener funktioniert nicht AWT, Swing, JavaFX & SWT 1
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
A Event Handling Muss ich 'KeyListener' tasuend mal zufügen? AWT, Swing, JavaFX & SWT 7
S mit keylistener frame schliessen AWT, Swing, JavaFX & SWT 8
S Keylistener reagiert bei Buttons nicht. AWT, Swing, JavaFX & SWT 8
S KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 2
R KeyListener in mehreren Panels AWT, Swing, JavaFX & SWT 5
V Tastatur KeyListener für mehrere Buttons AWT, Swing, JavaFX & SWT 1
J JLabel Visible setzen in KeyListener AWT, Swing, JavaFX & SWT 13
X KeyListener AWT, Swing, JavaFX & SWT 0
L KeyListener für JDialog AWT, Swing, JavaFX & SWT 7
N KeyListener funktioniert nicht richitg AWT, Swing, JavaFX & SWT 4
Z SnakeGame Schlange per KeyListener bewegen! AWT, Swing, JavaFX & SWT 10
T KeyListener AWT, Swing, JavaFX & SWT 2
GianaSisters JFrame mit JInternalFrames, Keylistener-Problem AWT, Swing, JavaFX & SWT 9
7 KeyListener tastatur temporär blockieren AWT, Swing, JavaFX & SWT 7
7 AWT problem: KeyListener/ test im Label umändern AWT, Swing, JavaFX & SWT 4
B SWT Problem: Wie kann man für jede TableColumn einen eigenen KeyListener registrieren. AWT, Swing, JavaFX & SWT 1
U Mouse + Keylistener AWT, Swing, JavaFX & SWT 12
K ActionListener mit KeyListener AWT, Swing, JavaFX & SWT 7
J JWindow und keylistener AWT, Swing, JavaFX & SWT 1
F JavaFX KeyListener zum Fenster öffnen/schließen AWT, Swing, JavaFX & SWT 9
D JTextArea auf KeyListener Command AWT, Swing, JavaFX & SWT 6
C KeyListener AWT, Swing, JavaFX & SWT 5
Doopy Event Handling KeyListener funktioniert nach Restart nicht mehr AWT, Swing, JavaFX & SWT 7
S KeyListener geht nicht AWT, Swing, JavaFX & SWT 12
C Swing KeyListener in JPanel AWT, Swing, JavaFX & SWT 2
A KeyListener Button wechseln & Programm beenden AWT, Swing, JavaFX & SWT 4
M Frage zu KeyListener bzgl. JApplet AWT, Swing, JavaFX & SWT 3
H Bild mit KeyListener verschieben AWT, Swing, JavaFX & SWT 2
C JTextField KeyListener AWT, Swing, JavaFX & SWT 6
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
bluerob Fehler bei Wertübermittlung über KeyListener AWT, Swing, JavaFX & SWT 3
E Swing KeyListener implementieren AWT, Swing, JavaFX & SWT 12
P KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 11
M KeyListener richtig implementieren AWT, Swing, JavaFX & SWT 3
T KeyListener AWT, Swing, JavaFX & SWT 4
R KeyListener in JWindow AWT, Swing, JavaFX & SWT 7
T BlueJ KeyListener AWT, Swing, JavaFX & SWT 7
Z KeyListener AWT, Swing, JavaFX & SWT 2
M Swing KeyListener in JTextfield AWT, Swing, JavaFX & SWT 4
C Swing KeyListener für JPanel funktioniert nicht AWT, Swing, JavaFX & SWT 8
VfL_Freak Swing KeyListener, um einen Dialog per ESC zu schließen AWT, Swing, JavaFX & SWT 6
A Keylistener reagiert nicht AWT, Swing, JavaFX & SWT 10
D Problem mit KeyListener AWT, Swing, JavaFX & SWT 2
J KeyListener um auf CTRL-Enter zu reagieren AWT, Swing, JavaFX & SWT 2
L Snake in Java KeyListener Problem AWT, Swing, JavaFX & SWT 30
B "globaler" KeyListener? AWT, Swing, JavaFX & SWT 3
B JTable TableHeader KeyListener AWT, Swing, JavaFX & SWT 4
S Swing KeyListener und JList AWT, Swing, JavaFX & SWT 2
R KeyListener funzt nicht AWT, Swing, JavaFX & SWT 2
X KeyListener AWT, Swing, JavaFX & SWT 4
P KeyListener + Animation AWT, Swing, JavaFX & SWT 2
M Fokus für KeyListener AWT, Swing, JavaFX & SWT 9
V Problem mit KeyListener im Fullscreen-Modus AWT, Swing, JavaFX & SWT 2
M AWT KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
C Swing KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 7
K JFrame + KeyListener + Runnable = Fehler AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben