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:
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?
 
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
 
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.
 
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
 
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.
 
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:
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.
 

Zurück
Oben