KeyListener wird nicht hinzugefügt

Status
Nicht offen für weitere Antworten.
L

liquid

Gast
hallo zusammen!
sitz gerade an einem arkanoid klon und habe das problem, dass in meiner klasse Fenster der befehl addKeyListener dezent übersprungen wird... :/
ich erstelle zuerst einen menu-panel, von dem aus über buttons das spiel gestartet wird bzw. die methode setzeImSpiel() aufgerufen wird. klappt auch alles soweit, wie es soll. nur springt das prog beim Fenster erstellen direkt von setSize() zu initZeichenFlaeche(). die klasse spiel beinhaltet die methode KeyEreignisBehandeln(e), die methoden z.b. der klasse schläger (steuern, ...) aufruft. das komische ist, dass wenn ich direkt ins spiel einsteige, also im konstruktor von fenster setzeImMenu() durch setzeImSpiel() austausche, der befehl addKeyListener ausführt wird und ich den schläger steuern kann. hat das was damit zu tun, dass das Spiel-objekt schon im konstruktor erstellt wird? weil eigentlich wirds ja auch erst nach dem addKeyListener() gemacht...
naja, ich checks irgendwie net, seid gnädig, bin halt n newbie... ;)

der code sieht folgendermaßen aus:

Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;

public class Fenster extends JFrame{
	
        Spiel s1;
        Menu m1;

        imSpiel = false;
        imMenu = false;

	public Fenster(){
		setTitle("Arkanoid");
		setBackground(Color.WHITE);
		setSize(breite, hoehe);
		
		// für Steuerung mit Tastatur
		addKeyListener(new KeyAdapter()
				{
					public void keyPressed(KeyEvent e)
					{
						s1.KeyEreignisBehandeln(e);
					}
				});
		
		// Vollbildmodus etc.
                 initZeichenFlaeche();
		
		// am Anfang ins Menu
		setzeImMenu();
		
		// zum Schließen des Fensters
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);		
		
		setVisible(true);
	}

        public void setzeImSpiel(){
		s1 = new Spiel(this);
		getContentPane().add(s1);
                getContentPane().remove(m1);
                imSpiel = true;
                imMenu = false;
	}

         public void setzeImMenu(){
		m1 = new Menu(this);
		getContentPane().add(m1);
                imSpiel = false;
                imMenu = true;
	}
}

ich hoff, ich hab das problem einigermaßen verständlich beschrieben, wäre echt cool, wenn mir da jemand helfen könnte, steh nämlich total aufm schlauch.
besten dank schon mal!
mfg
 

tini

Bekanntes Mitglied
Also mein Tipp wäre, dass, wenn du setzeImMenu() aufrufst, s1 nie initialisiert wird, d.h. null ist. Somit kannst du auch nicht darauf zugreifen, was du aber im KeyListener versuchst.
Versuch mal s1 im Konstruktor zu initialisieren, bevor du den KeyListener hinzufügst.

Wenn du setzeImSpiel aufrufst, ist s1 nicht null und somit funktioniert der Aufruf deines KeyListeners.
 
L

liquid

Gast
danke für die schnelle antwort erstmal!
aber das funktioniert auch nicht! komischerweise kann ich ja den KeyListener hinzufügen, wenn ich s1 = new Spiel(this);
nach dem addKeyListener aufrufe, aber nur, wenn ich das menu nicht erstelle...
d.h., jedes mal, wenn ich zuerst ein menu erstelle, egal, ob das spiel erstellt wurde oder nicht, wird addKeyListener übersprungen. und das versteh ich mal garnet!
naja, vielleicht hast du oder jemand anderes noch ne idee.
thx!!!
 

tini

Bekanntes Mitglied
Woher weißt du eigentlich, dass die Methode addKeyListner() übersprungen wird? Wie findest du das raus?
 
L

liquid

Gast
indem ich mir nen watchpoint bei setSize() setze, und von einer zur nächsten anweisung springe. und da sieht man, dass er garnet in die addButtonListener reingeht. außerdem hatte ich schon ein System.out.println in der keyPressed drin, noch vor dem zugriff auf s1.KeyEreignisBehandeln(e);, und das wurde auch nich angezeigt...
entweder, er fügt den Listener nicht hinzu, oder geht nicht in die keyPressed rein...
 

tini

Bekanntes Mitglied
also ich habe sowas ähnliches wie du. ein JPanel, welches auf Tastendruck reagieren soll.

da ist das so gelöst, dass das gesamte JPanel den KeyListener implementiert

also
Code:
class ... extends ... implements KeyListener bzw. KeyAdapter

und dann setze ich einfach die Methode keyPressed(KeyEvent e) noch zusätzlich in die Klasse.
ich weiß jetzt nicht, ob dir das was helfen würde. kannst es ja mal ausprobieren.

das verhalten ist schon sehr merkwürdig. dir ist aber schon klar, dass er in die keyPressed()-Methode nur reingeht, wenn du eine Taste drückst. D.h. wenn der Konstruktor läuft, ist es normal, dass er da nicht reingeht.
 
L

liquid

Gast
ja, finds auch echt merkwürdig, und jeder, dem ichs bis jetzt gezeigt hab, auch..
aber trotzdem erstmal danke für deine hilfe. ich probiers mal aus und werd dann mal posten, obs erfolgreich war.
mfg
 
L

liquid

Gast
ach ja, und dass er nur reingeht, wenn die taste gedrückt wird, is mir schon klar, ich drück ja auch jedes mal, wie ein bekloppter, und es kommt nix an... ;)
 
G

Guest

Gast
so, habs mal ausprobiert, funzt aber leider auch nicht!
zudem kommt noch, dass die klasse spiel schon ein implements auf ein von mir geschriebenes interface aufruft...
habs aber trotzdem mal getestet, ob es funktionieen würde, tuts nur leider nicht. ich hoffe, jemand hat da noch ne idee.
danke schon mal!
mfg
 

Mag1c

Top Contributor
Hi,

- mit getKeyListeners() bekommst du eine Liste der registrierten Listener. Lass dir die mal anzeigen.

- Hänge deinen Listener mal an das ContentPane (anstelle des Frames).

Gruß
Mag1c
 

L-ectron-X

Gesperrter Benutzer
Kopieren, kompilieren und probieren...
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class KeyListenerTest extends JFrame{
   private JLabel label;

   public KeyListenerTest(){
      setTitle("KeyListenerTest");
      setSize(400, 150);
      setLocationRelativeTo(null);
      setDefaultCloseOperation(EXIT_ON_CLOSE);

      addKeyListener(new KeyAdapter() {
         public void keyPressed(KeyEvent e) {
            action(e);
         }
      });

      label = new JLabel("Bitte Taste drücken!");
      label.setFont(new Font("Arial", Font.BOLD, 30));
      label.setHorizontalAlignment(SwingConstants.CENTER);
      getContentPane().add(label);
   }
   
   private void action(KeyEvent e) {
      label.setText(e.getKeyText(e.getKeyCode()));
   }
   
   public static void main(String[] args) {
      new KeyListenerTest().setVisible(true);
   }
}
Gibts bei dir was aus?
 
L

liquid

Gast
ok, danke für die antworten, hab alles getestet, also den listener in den panel, mir die listener anzeigen lassen und auch den code ausgeführt!

@mag1c
wenn der listener im panel steht, gehts auch net. außerdem wollt ich den gern im frame stehen lassen... und der listener wird net angezeigt, egal wo! :/

@l-ectron-x
der code funzt!

vor allem funktionierts ja, wenn ich net den umweg übers menu mache, sondern direkt im konstruktor ein spiel-objekt erstelle. is bestimmt ein so dummer fehler, dass ihn keiner sieht... ;)
freu mich trotzdem über weitere vorschläge!
mfg
 

Mag1c

Top Contributor
Moin,

ich habe mal deinen Code von oben ausprobiert (Spiel und Menu durch JPanel ersetzt). Damit klappt das. Poste doch mal deine Menu-Klasse.

Gruß
Mag1c
 
L

liquid

Gast
ok, hier die menu-klasse:

Code:
import javax.swing.*;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseEvent;

public class Menu extends JPanel{
	
	private Fenster f;
	
	JButton mb_neu, mb_ende;
	
	public Menu(Fenster f){
		this.f = f;
		
		erstelleMenu();
	}
	
	public void erstelleMenu(){
		f.setBackground(Color.WHITE);
		
		// Button1 erstellen und zu Panel hinzufügen
		mb_neu = new JButton("Neues Spiel");
		mb_ende = new JButton("Spiel beenden");
		
		setLayout(new GridLayout(5, 5));
		
		add(mb_neu);
		add(mb_ende);	
		
		// Button-Listener hinzufügen
		addButtonListener(mb_neu);
		addButtonListener(mb_ende);
	}
	
    public void addButtonListener(JButton b)
    {
        b.addActionListener(new ActionListener() 
        { 
            public void actionPerformed(ActionEvent e) 
            { 
            	String command = e.getActionCommand();
        		
        		if(command.equals("Neues Spiel")){
        			f.setzeImSpiel();
        			repaint();
        		}
        		if(command.equals("Spiel beenden")){
        			System.exit(0);
        		}
        				
            }
        });
    }
}

vielleicht liegt der fehler ja echt hier...
mfg
 

Mag1c

Top Contributor
Hi,

die KeyEvents werden von den Buttons "verschlungen", da diese den Focus haben.

Es gibt nun mehrere Wege, das Problem zu lösen. Wie ... das hängt nun davon ab, was du genau machen willst.

Gruß
Mag1c
 
L

liquid

Gast
hmm, ja, wie will ich das machen? ;) halt so, dass es funktioniert... hab halt keinen wirklichen plan, is mein erstes grafisches projekt überhaupt...
könntest du da ein bisschen konkreter sein, was lösungsvorschläge angeht?
besten dank!
 
G

Guest

Gast
ja, hast schon recht! hab ich auch gesehen, dass es sowas gibt! hatte mich damit net noch näher befasst, aber das is ja net unbedingt das problem,oder?
 

L-ectron-X

Gesperrter Benutzer
Für ein "normales" Menü werden eben Objekte von JMenu, JMenuItem oder verwandten Objekten sowie von JMenuBar benutzt. Natürlich kannst du auch Buttons in ein Panel packen, aber das ist eben eher "untypisch".
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Developer_X AWT KeyListener wird nicht ausgeführt! AWT, Swing, JavaFX & SWT 3
D Warum wird der KeyListener nicht angesprochen? AWT, Swing, JavaFX & SWT 10
J KeyListener wird ignoriert AWT, Swing, JavaFX & SWT 18
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
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
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
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
N JFrame und KeyListener AWT, Swing, JavaFX & SWT 6
M KeyListener reagiert nach Buttondruck nicht mehr AWT, Swing, JavaFX & SWT 4
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