Swing JButton macht Eventhandling kaputt

lamborgotti

Neues Mitglied
hallo,

Ich habe mich schon öfters mal darin versucht, irgendwie objektorientiert zu programmieren und jedes mal scheitert es daran, das irgendwas passiert, was ich nicht kapier ;(
Ich hab eigenlich noch gar nicht damit angefangen, was ich eigentlich tun will, aber schon bei aufbauen komm ich nicht weiter:

Im wesentlichen will ich ein Fenster mit 2 Panels(field und amaturen), im Linken will ich Knöpfe u.ä. und im Rechten grafische Sachen zeichnen.
Ausserdem hat die Oberklasse (World) einen KeyListener und wenn ich die Pfeiltasten bewege soll
sich im rechten Fenster(field) was bewegen, das hat auch prima geklappt, nur wenn ich jetzt im linken
Panel (amaturen) einen JButton hinzufüge, gehn die Keys nicht mehr(keine bewegung und kein System.out("blabla"))...?
Warum?
Ich könnte noch Stunden davor sitzen, es macht keinen Sinn, kann mir irgendwer helfen


Java:
public abstract class AWorld implements ActionListener, KeyListener, MouseListener {
	protected JFrame frame;
	protected Field field;
	protected Amaturen amaturen;
	[...]
	private void init() {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() { 
           
	  // call the method that shows the frame and initialize it
		this.createAndShowGUI(); 

		if (this.timerticks && this.timer != null) 
			this.timer.start();

		// add listeners (key and mouse)
		this.frame.addKeyListener(this);
		this.field.addKeyListener(this);
		//this.amaturen.addKeyListener(this);
		this.frame.addMouseListener(this);
		this.field.addMouseListener(this);
		//this.amaturen.addMouseListener(this);
	}
		});	
	}
}

/////////////////////////////////////////////////////////////////////////////
public final class World extends AWorld {
	public static void main(String args[]) {
		new World();
	}
	
	/** 
	 * This function is called by the World class to create your
	 * main window. 
	 */
	@Override
	protected void createAndShowGUI() {
	  this.frame = new JFrame("...");

	  frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
	  frame.getContentPane().setLayout(
                 new BoxLayout(frame.getContentPane(), BoxLayout.X_AXIS));
	    
	 this.enableTicks(1000);
	    		
	 this.field = new Field();
	 this.amaturen = new Amaturen();
		
	 frame.add(this.amaturen);
	 frame.add(this.field);
		
	 frame.pack();  
	 frame.setResizable(false);
         frame.setVisible(true);
    }
    
    public void keyPressed(KeyEvent e) {
		if (e.getKeyCode() == KeyEvent.VK_DOWN) {
			field.movePlayer(0, -10);
			System.out.println("asdf");
		}
		if (e.getKeyCode() == KeyEvent.VK_UP) {
			field.movePlayer(0, 10);
		}
		if (e.getKeyCode() == KeyEvent.VK_LEFT) {
			field.movePlayer(-10, 0);
		}
		if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
			field.movePlayer(10, 0); 
			System.out.println("right");
		}	
	}
    
}
  
/////////////////////////////////////////////////////////////////////////////
public class Amaturen extends JPanel //implements ActionListener
{
	public ZeitIndex zeitIndex; 
	public JButton startStop; 
	public JPanel pZeit;
	public JPanel pButtons;
	
	public Amaturen ()
	{
		setBorder(BorderFactory.createLineBorder(Color.black));
		setBackground(new Color(120, 120, 255));
		
		this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
		
		this.pZeit = new JPanel();
		this.zeitIndex = new ZeitIndex(0);
		this.pZeit.add(zeitIndex);
		this.add(pZeit);
		
		this.pButtons = new JPanel();
		this.startStop = new JButton("Start/Stop");
		//this.startStop.addActionListener(this);
		this.pButtons.add(startStop);    //<<=== HIER spinnts
		this.add(pButtons);
	}
}
Grüße und Danke schon im Voraus!
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Ist so jetzt schwer nachzuvollziehen, aber .. kann es sein, dass die Component, wo die KeyListener dranhängen, NICHT mehr den Focus hat, wenn der Button eingefügt wird? Schau ggf. mal, ob die Keys wieder funktionieren, wenn du vorher einmal mit der Maus auf die Component klickst, die die KeyListener hat. Ansonsten könnte ein KSKB vielleicht helfen...
 

lamborgotti

Neues Mitglied
ja kann ich verstehn ich hab mal versucht möglichst viel wegzustreichen was irrelavant für das Problem ist und es in eine Datei gemacht:
Java:
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

abstract class AWorld implements ActionListener, KeyListener, MouseListener {
	protected JFrame frame;
	protected Field field;
	protected Amaturen amaturen;

	public AWorld() 
	{
		this.init();
	}

	abstract protected void createAndShowGUI();

	@Override
	public final void actionPerformed(ActionEvent e) {}

	@Override
	public void keyPressed(KeyEvent e) {}
	@Override
	public void keyReleased(KeyEvent e) {}
	@Override
	public void keyTyped(KeyEvent e) {}
	@Override
	public void mouseClicked(MouseEvent e) {}
	@Override
	public void mouseEntered(MouseEvent e) {}
	@Override
	public void mouseExited(MouseEvent e) {}
	@Override
	public void mousePressed(MouseEvent e) {}
	@Override
	public void mouseReleased(MouseEvent e) {}
  
	
	private void init() {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				createAndShowGUIWrapper();
			}
		});	
	}
	
	private void createAndShowGUIWrapper() {
		
		this.createAndShowGUI(); 

		// add listeners (key and mouse)
		this.frame.addKeyListener(this);
		this.field.addKeyListener(this);
		this.amaturen.addKeyListener(this);
		
		this.frame.addMouseListener(this);
		this.field.addMouseListener(this);
		this.amaturen.addMouseListener(this);
	}
}


/////////////////////////////////////////////////////////////////////////////////////
public final class World extends AWorld {

	public static void main(String args[]) {
		new World();
	}
	
	@Override
  protected void createAndShowGUI() {
     this.frame = new JFrame("How to react on key events?");

     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(new BoxLayout(frame.getContentPane(), BoxLayout.X_AXIS));
        
     this.field = new Field();
     this.amaturen = new Amaturen();
      
     // Pack the Elements on the frame
     frame.add(this.amaturen);
     frame.add(this.field);
      
     frame.pack();  
     frame.setResizable(false);
     frame.setVisible(true);     
   }

	@Override
	public void keyPressed(KeyEvent e) {
		if (e.getKeyCode() == KeyEvent.VK_DOWN) {
			field.movePlayer(0, -10);
			System.out.println("down");
		}
		if (e.getKeyCode() == KeyEvent.VK_UP) {
			field.movePlayer(0, 10);
			System.out.println("up");
		}
		if (e.getKeyCode() == KeyEvent.VK_LEFT) {
			field.movePlayer(-10, 0);
			System.out.println("left");
		}
		if (e.getKeyCode() == KeyEvent.VK_RIGHT) {
			field.movePlayer(10, 0); 
			System.out.println("right");
		}	
	}
}
/////////////////////////////////////////////////////////////////////////////////////
class Amaturen extends JPanel implements ActionListener
{ 
	public JPanel pButtons;
	public JButton startStop;
		
	public Amaturen ()
	{
		setBorder(BorderFactory.createLineBorder(Color.black));
		setBackground(new Color(120, 120, 255));
		
		this.setLayout(new BoxLayout(this, BoxLayout.Y_AXIS));
		
		this.pButtons = new JPanel();
		this.startStop = new JButton("Start/Stop");
		this.startStop.addActionListener(this);
		this.add(startStop);            /////   <<<<============  Problem, wenn nicht auskommentiert
		this.add(pButtons);                                        // dann gehen Tasten nicht mehr
	}
	
	public Dimension getPreferredSize() {
        return new Dimension(200, 600);
  }
	
	public void actionPerformed(ActionEvent evt)
	{
		this.setBackground( Color.blue );
		System.out.println("asdf");
	  repaint();  
	}
	
}
/////////////////////////////////////////////////////////////////////////////////////
class Field extends JPanel {

  public Bubbel bubbel1;

	public Field() {
		setBorder(BorderFactory.createLineBorder(Color.black));
		setBackground(new Color(200, 200, 255));
		
		bubbel1 = new Bubbel(100, 100);
	}
		
	public Dimension getPreferredSize() {
      return new Dimension(800, 600);
  }

  public void paintComponent(Graphics g) {
      super.paintComponent(g);       

      // Zeichen Bubbel, den man bewegen kann
      g.setColor(Color.red);
      g.fillArc(bubbel1.x, bubbel1.y, 10, 10, 0, 360);
  } 
    
    public void movePlayer (int x, int y)
    {
    	bubbel1.x += x;
    	bubbel1.y -= y;
    	repaint();
    }       
}
/////////////////////////////////////////////////////////////////////////////////////
class Bubbel 
{
	int x;
	int y;

	public Bubbel (int x, int y)
	{
		this.x = x;
		this.y = y;    
	}
}
Das mit dem Fokus ist schon mal ein guter Tipp, aber mit draufklicken geht das auch nicht. Und ich weiss auch nicht, wie ich den Fokus wieder zurück auf den Listener zurückbekomme.
Ich bin mir auch nicht so sicher was die gesamte Struktur von den Dateien angeht, ich hab die Grundstrucktor von einer Vorlage(deswegen das abstrakte AWorld), aber ich glaube ich nutze sie nicht ganz im Sinne des Erfinders.
 
Zuletzt bearbeitet:

Marco13

Top Contributor
Hmja.. in bezug auf die Struktur... Wenn man objektorientiert programmiert, verwendet man Klassen. Umgekehrt gilt diese Implikation NICHT. Also, mir ist nicht ganz klar, wozu die Vererbung mit der AWorld in diesem Fall gut sein soll ???:L

Es ist - wie vermutet - das Problem mit dem Focus: Wenn man
Code:
     this.field = new Field();
     [b]this.field.setFocusable(true); // <--- diese Zeile [/b]
 ....
einfügt, kann man mit "TAB" den Focus zwischen dem Button und dem Feld hin- und herschalten - und wenn er im Feld ist, kann man den Punkt bewegen. Mit
Code:
...
     [b]this.field.requestFocus(); // <--- dieser Zeile[/b]
     frame.setVisible(true);
kann man auch erreichen, dass das Spielfeld am Anfang dem Focus hat - bis man einmal den Button klickt.

Spontan würden mir mindestens ... 4 oder 5 Wege einfallen, wie man dieses Problem lösen könnte... und davon sind nur die wenigsten für das Problem angebracht. Am ehesten noch mit einem KeyEventDispatcher oder mit Key bindings How to Use Key Bindings (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Other Swing Features)

Ich würde eher zu letzterem raten, da das recht "high-level" und trotzdem ganz gut steuerbar ist, aber ... warte mal ab, ob noch jemand weitere Vorschläge macht...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
O Swing JButton werden richtig gewechselt aber die Maus macht die alten wieder Sichtbar?? AWT, Swing, JavaFX & SWT 5
G JButton mit importFiles-Funktion auf JDrawPane AWT, Swing, JavaFX & SWT 5
B JButton Search AWT, Swing, JavaFX & SWT 8
B Swing JButton mit KeyListener AWT, Swing, JavaFX & SWT 3
L JButton durch Mausklick auslösen und Enter-Taste AWT, Swing, JavaFX & SWT 2
N Erlennen ob JButton gedrückt ist AWT, Swing, JavaFX & SWT 6
D JButton Form verändern AWT, Swing, JavaFX & SWT 4
R Grafik per JButton laden und austauschen lassen AWT, Swing, JavaFX & SWT 14
SvenPittelkow Programm soll auf JButton warten bis der geklickt wurde AWT, Swing, JavaFX & SWT 1
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
Z Swing Drag and Drop mit einem JButton AWT, Swing, JavaFX & SWT 1
Z Swing Kann man auf JButton zeichenen AWT, Swing, JavaFX & SWT 3
J JButton Icon hinzufügen AWT, Swing, JavaFX & SWT 5
U Swing JButton mit Icon AWT, Swing, JavaFX & SWT 7
ms_cikar Jbutton erzeugt neue Buttons AWT, Swing, JavaFX & SWT 2
Drachenbauer Swing Wie ändere ich die Farbe der Konturen von jButton und jCombobox? AWT, Swing, JavaFX & SWT 18
Drachenbauer Swing Wie ändere ich die helle geklickt-Farbe von einem JButton? AWT, Swing, JavaFX & SWT 4
A Swing JButton mit Pfeiltasten bewegen AWT, Swing, JavaFX & SWT 6
F Swing Scrollbare Liste von JButton AWT, Swing, JavaFX & SWT 4
Hatsi09 JButton text layout AWT, Swing, JavaFX & SWT 9
J JButton zum ändern Der Schriftart/Schriftgröße AWT, Swing, JavaFX & SWT 2
A Swing JButton aussehen AWT, Swing, JavaFX & SWT 12
J jButton soll nach klicken eine Variable um 1 erhöhen AWT, Swing, JavaFX & SWT 2
Legi Swing JButton Icon verschiebt sich AWT, Swing, JavaFX & SWT 2
T Swing Änderung des ActionListener Events nach Klick auf JButton AWT, Swing, JavaFX & SWT 2
S Swing JButton verschwindet nach Compilieren AWT, Swing, JavaFX & SWT 8
B Swing Posistion von JButton auslesen gibt immer 0 aus AWT, Swing, JavaFX & SWT 1
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
G Swing JButton ändert (unerwünscht) Größe bei Ausführung AWT, Swing, JavaFX & SWT 4
MR._FIRE_Flower Variable setzten mit JButton AWT, Swing, JavaFX & SWT 5
S Mit JButton neues Fester öffnen und das alte schließen AWT, Swing, JavaFX & SWT 3
T JButton wird beim vergrößern des Fensters erst sichtbar AWT, Swing, JavaFX & SWT 4
R Swing Verändern der Ausrichtung JButton und neu anzeigen AWT, Swing, JavaFX & SWT 2
G Swing JButton - Keine Klickanimation AWT, Swing, JavaFX & SWT 4
Joker4632 JButton nicht sichtbar, aber funktionsfähig AWT, Swing, JavaFX & SWT 8
B Swing JButton deaktivieren, wenn nicht alle JTextFields ausgefüllt sind. AWT, Swing, JavaFX & SWT 2
D JButton per Tastenkombi auswählen AWT, Swing, JavaFX & SWT 2
K JButton nicht sichtbar machen für User 2 AWT, Swing, JavaFX & SWT 4
L Swing JButton soll link öffnen AWT, Swing, JavaFX & SWT 1
K JButton auf anderer Klasse AWT, Swing, JavaFX & SWT 6
A JButton soll durch anklicken die Farbe wechseln AWT, Swing, JavaFX & SWT 8
T KeyListener funktioniert nicht wenn ich ein JButton hinzufüge AWT, Swing, JavaFX & SWT 1
R Swing ActionListener bei JButton AWT, Swing, JavaFX & SWT 9
B JButton -> Rahmen wegbekommen AWT, Swing, JavaFX & SWT 7
N JButton über benutzerdefinierte paintComponent setzen AWT, Swing, JavaFX & SWT 3
T JButton überlagern sich und werden erst beim Mausscrollen sichtbar AWT, Swing, JavaFX & SWT 2
B JButton erscheint in JFrame, obwohl er diesem nicht zugeordnet wurde! AWT, Swing, JavaFX & SWT 1
M JButton Probleme AWT, Swing, JavaFX & SWT 14
T Klasse über JButton schließen AWT, Swing, JavaFX & SWT 4
M Textfarbe JButton verändern AWT, Swing, JavaFX & SWT 2
N JButton ausblenden AWT, Swing, JavaFX & SWT 2
M Swing jButton Text verschwindet AWT, Swing, JavaFX & SWT 2
C Swing JButton wird nicht angezeigt AWT, Swing, JavaFX & SWT 2
stylegangsta JLabel durch Klick auf JButton einblenden AWT, Swing, JavaFX & SWT 16
stylegangsta Eigene Klasse für JButton aus dem JFrame abrufen AWT, Swing, JavaFX & SWT 29
stylegangsta MouseEvents aus JButton aufrufen AWT, Swing, JavaFX & SWT 3
stylegangsta JButton Transparent anzeigen AWT, Swing, JavaFX & SWT 9
stylegangsta JButton Fehelr javax.swing.ImageIcon.<init>(Unknown Source) AWT, Swing, JavaFX & SWT 24
X Swing JButton's zum JScrollPane hinzufügen geht nicht. Bitte um Hilfe. AWT, Swing, JavaFX & SWT 9
D JButton - Nur Icon anzeigen / transparenter Hintergrund AWT, Swing, JavaFX & SWT 2
S JButton-Label vergrößern AWT, Swing, JavaFX & SWT 2
J Swing Basics - JButton funktioniert nicht. AWT, Swing, JavaFX & SWT 1
L JButton mit ImageIcon/Fehlermeldung AWT, Swing, JavaFX & SWT 1
D jButton Problem, ein Rieser Button bedeckt das ganze frame AWT, Swing, JavaFX & SWT 1
L Array mit JButton, wie rausfinden auf welche JButton geklickt wurde + index des JButtons ausgeben AWT, Swing, JavaFX & SWT 4
K (GUI) JButton Farbe bei druck ändern AWT, Swing, JavaFX & SWT 3
L JButton mit Image AWT, Swing, JavaFX & SWT 5
fLooojava JButton [Focus) AWT, Swing, JavaFX & SWT 4
M JButton - Listener AWT, Swing, JavaFX & SWT 1
D jButton auf von jFrame erzeugtem jDialog AWT, Swing, JavaFX & SWT 16
L JButton flackern - Programm hängt sich auf AWT, Swing, JavaFX & SWT 3
L JButton - Größe anders als erwartet AWT, Swing, JavaFX & SWT 2
1 JButton nach Klick ausblenden AWT, Swing, JavaFX & SWT 6
X Swing 1 JButton bedeckt meine ganze Frame aber Warum? AWT, Swing, JavaFX & SWT 2
S Größe und Farbe vom JButton festlegen AWT, Swing, JavaFX & SWT 2
H Swing JList/JTable mit JButton, JTextField, Image, JComboBox und JLable AWT, Swing, JavaFX & SWT 2
J JButton neu zeichnen lassen AWT, Swing, JavaFX & SWT 9
S JButton u. Label auf paint-Methode AWT, Swing, JavaFX & SWT 1
HoloYoitsu Swing JButton in verschiedenen Winkeln drehen AWT, Swing, JavaFX & SWT 0
J vocab1 = new JButton(""+voc1.get(nr).toString()+""); AWT, Swing, JavaFX & SWT 16
A JButton wird bei ActionListener nicht "angenommen" AWT, Swing, JavaFX & SWT 7
BRoll JButton Text nicht ausblenden ("...") AWT, Swing, JavaFX & SWT 2
I JFrame mit JButton schließen? AWT, Swing, JavaFX & SWT 0
D JList&JButton erst nach Resize des JFRame sichtbar AWT, Swing, JavaFX & SWT 2
J Swing JFrame slideout, wenn JButton gedrückt wurde AWT, Swing, JavaFX & SWT 0
S Swing Rückmeldung für JButton AWT, Swing, JavaFX & SWT 4
R AWT JLabel oder JButton aktualisieren AWT, Swing, JavaFX & SWT 1
L JButton im Frame fest verankern AWT, Swing, JavaFX & SWT 0
M Swing Mix JComboBox - JButton? AWT, Swing, JavaFX & SWT 6
U Event Handling JButton Actionevent: starte Spiel AWT, Swing, JavaFX & SWT 4
E JButton füllt ganzes JPanel auf AWT, Swing, JavaFX & SWT 6
P Verbuggte custom JButton unter Windows AWT, Swing, JavaFX & SWT 9
W Swing JButton lässt sich nicht anzeigen AWT, Swing, JavaFX & SWT 8
Kandum Swing JButton - onclick -> Grafikfehler AWT, Swing, JavaFX & SWT 2
R JButton durch Enter auslösen AWT, Swing, JavaFX & SWT 7
T Swing JButton per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 5
M Problem mit FlowLayout, JLabel und JButton AWT, Swing, JavaFX & SWT 4
M JButton wird von JTree überdeckt AWT, Swing, JavaFX & SWT 4
D Swing JButton.setenabled(true) funktioniert nicht AWT, Swing, JavaFX & SWT 12
B JButton ausblenden AWT, Swing, JavaFX & SWT 12

Ähnliche Java Themen

Neue Themen


Oben