Swing KeyListener reagiert nicht

Curry

Aktives Mitglied
Moin Moin!

Ich habe ein JFrame welches zwei JPanels besitzt. Zum Einen ein Spielfeld für Pong und zum Anderen eine Anzeigetafel für den aktuellen Spielstand.

Doch wenn ich die Anzeigetafel dem JFrame hinzufüge (Zeile 13 - 15), dann funktioniert dessen KeyListener nicht mehr. Ich vermute, dass es was mit dem Focus zu tun hat, aber alles was ich bisher ausprobiert habe war erfolglos.

Hat jmd. eine Idee?

Java:
public class MyFrame extends JFrame implements WindowListener, KeyListener {

	private PongField field;

	public MyFrame(String title) {
		super(title);
		this.setSize(500, 500);
		this.addWindowListener(this);
		this.addKeyListener(this);

		Score score = new Score();

		Scoreboard scoreboard = new Scoreboard(score);
		scoreboard.setFocusable(false);
		getContentPane().add(scoreboard, BorderLayout.NORTH);

		field = new PongField(score);
		getContentPane().add(field, BorderLayout.CENTER);

		this.requestFocus();
	}

	// #####################################
	// Interface: WindowListener
	// #####################################
	public void windowActivated(WindowEvent event) {}

	public void windowClosed(WindowEvent event) {}

	public void windowClosing(WindowEvent event) {
		event.getWindow().setVisible(false);
		event.getWindow().dispose();
		System.out.println("Programm wurde geschlossen");
		System.exit(0);
	}

	public void windowDeactivated(WindowEvent event) {}

	public void windowDeiconified(WindowEvent event) {}

	public void windowIconified(WindowEvent event) {}

	public void windowOpened(WindowEvent event) {}

	// #################################
	// Interface: KeyListener
	// #################################
	public void keyPressed(KeyEvent event) {
		System.out.println("keyPressed");
		field.keyPressed(event);
	}

	public void keyReleased(KeyEvent event) {
		field.keyReleased(event);
	}

	public void keyTyped(KeyEvent event) {
	}
}
 

eRaaaa

Top Contributor
Ich vermute, dass es was mit dem Focus zu tun hat, aber alles was ich bisher ausprobiert habe war erfolglos.


Vermute ich auch, es wäre auch nicht schlecht, wenn du beschreibst was du ausprobiert hast.
Und ein simples Beispiel was jeder ausführen kann würde auch helfen, wenn ich nämlich beispielsweise dein Scoreboard entferne und das PongField durch ein JPanel ersetze, funktioniert dein Code bei mir, da diese beiden Klassen aber niemand kennt, ist es nur schwer nachzuvollziehen!

Evtl. suchst du aber auch KeyBindings --> How to Use Key Bindings (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Other Swing Features)
 

Curry

Aktives Mitglied
Ich habe das Problem gerade selbst lösen können.

Der Code der Klasse "scoreboard.java" schaut so aus:

Java:
public class Scoreboard extends JPanel implements Observer {

	JTextField score1, score2;
	Score score;

	public Scoreboard(Score score) {
		this.score = score;
		this.score.addObserver(this);
		initComponents();
	}

	public void initComponents() {
		setLayout(new GridBagLayout());
		GridBagConstraints gbc = new GridBagConstraints();
		gbc.insets = new Insets(3, 3, 3, 3);
		
		JLabel label1 = new JLabel("Spieler 1:");
		gbc.gridy = 1;
		gbc.gridx = 1;
		add(label1, gbc);

		score1 = new JTextField("0", 5);
		score1.setEditable(false);
		score1.setHorizontalAlignment(JTextField.CENTER);
		gbc.gridy = 1;
		gbc.gridx = 2;
		add(score1, gbc);

		JLabel label2 = new JLabel("Spieler 2:");
		gbc.gridy = 2;
		gbc.gridx = 1;
		add(label2, gbc);

		score2 = new JTextField("0", 5);
		score2.setEditable(false);
		score2.setHorizontalAlignment(JTextField.CENTER);
		gbc.gridy = 2;
		gbc.gridx = 2;
		add(score2, gbc);
	}

	public void update(Observable o, Object arg) {
		score1.setText( String.valueOf( score.getScore(0) ) );
		score2.setText( String.valueOf( score.getScore(1) ) );
	}
	
}

Das Problem waren die JTextFields, die, auch wenn sie auf
Code:
score2.setEditable(false);
gestellt waren, den Focus auf sich zogen. Wenn die JTextFields jeweils als
Code:
score2.setFocusable(false);
deklariert werden, dann funktioniet es wieder.

Allerdings würde mich interessieren, ob es auch ohne eine Änderung in der Klasse "scoreboard.java" hinzubekommen wäre.
 

Quaxli

Top Contributor
Zeig doch mal den Code von Pongfield, oder pack das ganze Ding mit Source Code in ein Jar und hänge es hier an.

In Deinem ganz oben geposteten Code könntest Du Dir den ganze Teil für den WindowListener übrigens sparen. Soweit ich das sehe könnte er im Konstruktor durch

setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

ersetzt werden.
 

Curry

Aktives Mitglied
Anbei habe ich den bisherigen Quellcode als ZIP-Datei angehängt.

Das Problem, weshalb dieser Beitrag gestartet wurde, hatte ich bereits gelöst, aber wie oben geschrieben würde ich es gerne besser verstehen.

Allerdings habe ich ein neues Problem. Ich möchte eine Ebene (InfoPanel) über das Spielfeld legen. Auf diese Ebene sollen von Zeit zu Zeit Ereignisinformationen dargestellt werden. Allerdings soll diese Ebene das Spielfeld nicht komplett verdecken, sondern nur dessen Schrift und / oder Animationen. Allerdings habe ich bisher keinen Weg gefunden eine Ebene mit einem Transparenten Hintergrund zu erstellen. Per Standard ist die Ebene grau, ich bekomme sie auch blau oder rot ... aber eben nicht transparent. ;-)

Die Info-Ebene und die Ebene des Spielfeldes werden im Hauptfenster mit Hilfe eines CardLayouts übereinander gelegt.

Hat jemand eine Idee?

p.s. Bezüglich des WindowListeners: Hier plane ich später ein "ungeschicktes" Schließen des Fensters bei einem laufenden Spiel zu unterbinden.
 

Anhänge

  • Pong.zip
    6,4 KB · Aufrufe: 1
Zuletzt bearbeitet:

Quaxli

Top Contributor
Ich habe mir das Programm mal angesehen, aber zum Laufen habe ich es nicht bekommen. :( Bei mir funktioniert das Umschalten des CardLayout nicht und wenn ich es umgehen wollte, ist mir Dein PongField abgenibbelt, weil der Ball noch gar nicht erzeugt wurde.

Da scheint noch einiges im Argen zu liegen.

Nachdem ich das Teil nicht vernünftig zum Laufen gebracht habe, kann ich auch nichts zu Deinem Problem mit dem Socreboard sagen.

Ein paar Anmerkungen zu Dingen, die mir beim Durchsehen aufgefallen sind:

- warum Du die Objekte nicht im Konstruktor der Klasse PongField erzeugst ist mir nicht klar. Dadurch stürzt bei mir das Programm ab, weil diese erst in paintComponent erzeugt werden. Dort sollte aber eigentlich nur gezeichnet werden.

- bei einem JPanel ist es unnötig, die update-Methode zu überschreiben. Die Komponente ist von Haus aus doppelt gepuffert und sollte auch ohne Überschreiben von update funktionieren

- Racket würde ich von Rectangle erben lassen oder von Rectangle2D.Double wenn Du mit höherer Genauigkeit arbeiten möchtest. Da spart Dir die Definition einiger Variablen. Außerdem erbst Du damit einige Methoden, die Du später gebrauchen kannst wie z. B. intersects oder contains (vgl. API) und sparst Dir die Klasse Border zur Kollisionsermittlung

- gleiches gilt für die Klasse PongBall

- die Kollisionsermittlung zwischen Ball und Schläger würde ich nicht in die Ball-Klasse packen, sondern außerhalb im GameLoop durchführen. Dann muß der Ball die Schlägerobjekte auch nicht kennen.

Soweit von mir. Falls ich die Zeit finde, daß Ding zum Laufen zu kriegen, gucke ich nochmal näher drauf. ;)
 

Curry

Aktives Mitglied
Danke Quaxli!

Ich habe dein Tutorial gefunden und bin gerade dabei ein paar Sachen - hauptsächlich was du eben auch geschrieben hast - zu verändern.

Wenn das läuft, dann werde ich mich noch einmal melden.
 

Curry

Aktives Mitglied
Aufgrund des veränderten Schwerpunkts meiner Frage, habe ich einen neuen Beitrag in dem Forum erstellt.

Neuer Beitrag: http://www.java-forum.org/awt-swing-swt/114749-info-ebene-ueberdeckt-spielfeld-ebene-komplett.html

@Quaxli: Dein Tutorial ist richtig gut! Viele Lösungsansätze konnte ich auf mein Programm übertragen, was dadurch sehr viel übersichtlicher und besser strukturiert ist. Einige neue Fragen hat es aber auch aufgeworfen … welche ich nach einer Pause weiter nachgehen werde.

Ich würde mich auf jeden Fall sehr über ein Kommentar von Dir zum aktuellen Stand freuen!
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B KeyListener auf JFrame reagiert nicht AWT, Swing, JavaFX & SWT 8
T Event Handling KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
S Keylistener reagiert bei Buttons nicht. AWT, Swing, JavaFX & SWT 8
P KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 11
A Keylistener reagiert nicht AWT, Swing, JavaFX & SWT 10
M AWT KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
M KeyListener reagiert nach Buttondruck nicht mehr AWT, Swing, JavaFX & SWT 4
A JButton reagiert nicht auf KeyListener//Focuslistener AWT, Swing, JavaFX & SWT 4
G KeyListener reagiert nicht AWT, Swing, JavaFX & SWT 10
T KeyListener reagiert seltsam bei F10 (Systemtasten?) AWT, Swing, JavaFX & SWT 5
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
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
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 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
A Swing KeyEvent mit KeyListener und KeyAdapter kürzer schreiben AWT, Swing, JavaFX & SWT 7
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
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
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
K JFrame + KeyListener + Runnable = Fehler AWT, Swing, JavaFX & SWT 3
F Tastenabfrage (KeyListener) AWT, Swing, JavaFX & SWT 2
D KeyListener Problem bei JPanel wechsel AWT, Swing, JavaFX & SWT 2
S Swing JTree mit KeyListener AWT, Swing, JavaFX & SWT 2
L AWT KeyListener, requestFocus und KeyBindings AWT, Swing, JavaFX & SWT 8
E JFrame akzeptiert den KeyListener nicht AWT, Swing, JavaFX & SWT 3
F Swing Problem mit KeyListener||paintComponent() in JFrame AWT, Swing, JavaFX & SWT 12
P Swing KeyListener hört nur manchmal zu AWT, Swing, JavaFX & SWT 2
Screen Focus Problem , KeyListener, TextField , Key AWT, Swing, JavaFX & SWT 4
earlgrey_tea AWT KeyListener bekommt keine Signale AWT, Swing, JavaFX & SWT 3
L Problem mit KeyListener AWT, Swing, JavaFX & SWT 3
A KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 4
D KeyListener-Problem nach dem "Gedrückthalten" einer Taste AWT, Swing, JavaFX & SWT 10
B Swing Keylistener fuer Dialog-Buttons AWT, Swing, JavaFX & SWT 2
B KeyListener Strg+s AWT, Swing, JavaFX & SWT 5
D Globaler Keylistener AWT, Swing, JavaFX & SWT 4
M problem mit keylistener/textarea AWT, Swing, JavaFX & SWT 6
M KeyListener Problem unter Firefox AWT, Swing, JavaFX & SWT 2
L AWT KeyListener, Taste gedrückt halten AWT, Swing, JavaFX & SWT 12
M Komisches Verhalten: JCombobox mit KeyListener AWT, Swing, JavaFX & SWT 13
capgeti SWT KeyListener 2 Tasten Problem AWT, Swing, JavaFX & SWT 3
R KeyListener - welcher Komponente hinzufügen AWT, Swing, JavaFX & SWT 5
Developer_X AWT KeyListener wird nicht ausgeführt! AWT, Swing, JavaFX & SWT 3
N JFrame und KeyListener AWT, Swing, JavaFX & SWT 6
A AWT Button verhindert ausführung vom Keylistener AWT, Swing, JavaFX & SWT 4
R KeyListener hinzufügen AWT, Swing, JavaFX & SWT 7
T Swing KeyListener mit mehreren Objekten AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben