Thread per Button starten

Java xyrse123

Bekanntes Mitglied
Hallo,
ich habe eine Klasse GameThread, wo ein Ball bewegt wird und Tastaturabfragen mit einem KeyListener gemacht werden. Wenn ich jetzt den gamethread im Konstruktor von ButtonEreignisse aufrufe, funktioniert alles richtig, aber wenn ich den Thread in der ActionPerformed Methode(also bei Buttonklick starten) bewegt sich nur der Ball und auf Tastaturdrücke wird nicht mehr reagiert.

Schonmal danke im Vorraus.

Java:
 class ButtonEreignisse extends JPanel implements ActionListener { // ButtonEreignisse
        JButton button1 = new JButton("Pause");
        JButton button2 = new JButton("Start Computer");
        JButton button3 = new JButton("Start ");
        JButton button4 = new JButton("Beenden");
       
        ButtonEreignisse() {       
            setPreferredSize(new Dimension(100, 100));
            setBackground(Color.YELLOW);
            setLayout(new FlowLayout());           
            setFocusable(true);
            gamethread = new GameThread(); // funktioiert
            gamethread.start();   
           
            button1.addActionListener(this);
            button2.addActionListener(this);
            button3.addActionListener(this);
            button4.addActionListener(this);
                                 
            add(button1);
            add(button2);
            add(button3);
            add(button4);
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            if(button3==e.getSource()) {
                  // Hier soll der Thread gestartet werden, nur Ball bewegt sich              
            }
            button3.setEnabled(false);
        }
   
       
    }
 

Blender3D

Top Contributor
Der KeyListener sendet nur an Steuerelemente die den Focus haben. Durch den Klick auf den Button erhält dieser den Fokus und das Fenster, dass den Fokus hatte verliert diesen. --> Keine Meldungen an das ursprüngliche Fenster.
 

Java xyrse123

Bekanntes Mitglied
OK, danke.
Ich habe jetzt versucht dem Gamepanel den Fokus zurückzugeben mit gamepanel.requestFocus(), aber die Schläger bewegen sich immer noch nicht
 

Blender3D

Top Contributor
Du verwendest wahrscheinlich einen JFrame als Hauptfenster.
Gib diesen den KeyListener.
JFrame f;
f.setFocusable(true);
f.addKeyListerner( game );
 

Java xyrse123

Bekanntes Mitglied
Mein Konstruktor von der Hauptklasse sieht jetzt so aus(Pong ist von JFrame abgeleitet, sonst hätte ich an anderer Stelle nicht repaint() aufrufen können), aber die Schläger lassen sich immer noch nicht bewegen:

Java:
public Pong() {                             
            setSize(800, 800);                               
            setLayout(new FlowLayout());                           
            add(buttons);
            add(gamepanel);
            setFocusable(true);
            addKeyListener(gamethread);
            setVisible(true);        
    }
 

Blender3D

Top Contributor
Code:
import javax.swing.JFrame;

public class start {
    public static void main(String[] args) {
        JFrame f = new JFrame();
        GamePanel game = new GamePanel(500, 500);
        f.getContentPane().add(game);
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setResizable(false);
        f.setTitle("KeyListener");
        f.setVisible(true);
        game.startGame();
    }
}
Code:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Point;
import java.awt.Rectangle;

public class Racket {
    public static enum DIRECTION {
        LEFT, RIGHT, UP, DOWN
    };

    private float x = 0;
    private float y = 0;
    private int width = 0;
    private int height = 0;
    private float speed = 1;
    private Color color = Color.RED;

    public Racket(int width, int height) {
        this.width = width;
        this.height = height;
    }

    public void draw(Graphics g) {
        Color old = g.getColor();
        g.setColor(color);
        g.fillRect((int) x, (int) y, width, height);
        g.setColor(old);
    }

    public Rectangle getColissonRect() {
        return new Rectangle((int) x, (int) y, width, height);
    }

    public int getHeight() {
        return height;
    }

    public Point getPosition() {
        return new Point((int) x, (int) y);
    }

    public float getSpeed() {
        return speed;
    }

    public int getWidth() {
        return width;
    }

    public void move(DIRECTION dir) {
        switch (dir) {
        case DOWN:
            y += speed;
            break;
        case LEFT:
            x -= speed;
            break;
        case RIGHT:
            x += speed;
            break;
        case UP:
            y -= speed;
            break;
        }
    }

    public void setColor(Color color) {
        this.color = color;
    }

    public void setPosition(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void setSpeed(float speed) {
        this.speed = speed;
    }

}
Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsEnvironment;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.image.BufferedImage;

import javax.swing.JButton;
import javax.swing.JPanel;

@SuppressWarnings("serial")
public class GamePanel extends JPanel implements ActionListener, Runnable, KeyListener {
    private JButton left = new JButton("left");
    private JButton right = new JButton("right");
    private final GraphicsConfiguration gfxConf = GraphicsEnvironment.getLocalGraphicsEnvironment()
            .getDefaultScreenDevice().getDefaultConfiguration(); // used to create image for drawing
    private BufferedImage imageBuffer = null; // used to draw graphics
    private boolean running = false; // @see running
    private Thread animator = null; // thread for game ticks
    private Racket racket = new Racket(50, 15);

    public GamePanel(int width, int height) {
        setPreferredSize(new Dimension(width, height));
        add(left);
        add(right);
        right.addActionListener(this);
        left.addActionListener(this);
        racket.setPosition((width - racket.getWidth()) / 2, height - racket.getHeight());
        racket.setSpeed(2.5f);
        left.addKeyListener(this);
        right.addKeyListener(this);
        addKeyListener(this);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); // TODO
        if (imageBuffer == null || imageBuffer.getWidth() != getWidth() || imageBuffer.getHeight() != getHeight()) {
            imageBuffer = gfxConf.createCompatibleImage(getWidth(), getHeight());
        }
        if (imageBuffer != null)
            g.drawImage(imageBuffer, 0, 0, this);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object src = e.getSource();
        if (src == left)
            racket.move(Racket.DIRECTION.LEFT);
        if (src == right)
            racket.move(Racket.DIRECTION.RIGHT);
        repaint();
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_Y)
            racket.move(Racket.DIRECTION.LEFT);
        if (e.getKeyCode() == KeyEvent.VK_X)
            racket.move(Racket.DIRECTION.RIGHT);
        repaint();
    }

    @Override
    public void keyReleased(KeyEvent e) {
    }

    @Override
    public void keyTyped(KeyEvent e) {
    }

    @Override
    public void run() {
        while (running) { // false -> stops game
            try {

                updateGraphics(); // draw graphics
                Thread.sleep(5); // 1000 / 5 update game every 200 millisecond
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public void startGame() {
        stopGame();
        while (animator != null && animator.isAlive())
            ;
        animator = new Thread(this);
        running = true;
        animator.start();

    }

    public void stopGame() {
        running = false;
    }

    public void updateGraphics() {
        if (imageBuffer != null) {
            Graphics g = imageBuffer.createGraphics();
            g.setColor(Color.black);
            g.fillRect(0, 0, getWidth(), getHeight());
            racket.draw(g);
        }
        repaint();
    }

}
Hier ein Beispiel wie Du es hinbekommst. Ein Schläger wird mittels der Tasten 'y' und 'x' oder mittels 2 Buttons bewegt.
:rolleyes:
 

Java xyrse123

Bekanntes Mitglied
Ok, danke. Ich habe mir gerade eine kleine Testklasse geschrieben um es besser zuverstehen.
Bei mir sind Buttons und die KeyEvents auf bei unterschiedlichen Panels hinzugefügt, bei dir sind die KeyEvents und ButtonEreignisse ja auf einem Panel. Musst du dewegen nicht den Fokus mit requestFokus() ändern?

Bei diesem kleinen Beispiel geht es nur mit requestFokus():
Java:
public class FokusTest implements KeyListener {
    Buttonereignis b = new Buttonereignis();
    JFrame f = new JFrame();
 
    FokusTest() {
     
        f.setSize(300,300);
        f.setLayout(new FlowLayout());
        f.add(b);
        f.setFocusable(true);
        f.setVisible(true);
        f.addKeyListener(this);
     
 
    }

    @Override
    public void keyPressed(KeyEvent e) {
        if (e.getKeyCode() == KeyEvent.VK_W) {
            System.out.println("W Taste gedrüctk"); 
            }
     
    }

    @Override
    public void keyReleased(KeyEvent e) {
        // TODO Auto-generated method stub
     
    }

    @Override
    public void keyTyped(KeyEvent e) {
        // TODO Auto-generated method stub
     
    }
 
    class Buttonereignis extends JPanel implements ActionListener{
        JButton button = new JButton("Fokus");
     
        Buttonereignis() {
        setPreferredSize(new Dimension(100,100))    ;
        setBackground(Color.YELLOW);
        button.addActionListener(this);
        add(button);
        }

        @Override
        public void actionPerformed(ActionEvent e) {
            if(button==e.getSource()) {
                System.out.println("Ich habe Fokus");
                f.requestFocus(); // Fokuswechsel
            System.out.println("Fokus zum Frame");
}
         
        }
    }
         
    public static void main(String[] args) {
        new FokusTest();
    }
}
 
Zuletzt bearbeitet:

Blender3D

Top Contributor
Ok, danke. Ich habe mir gerade eine kleine Testklasse geschrieben um es besser zuverstehen.
Bei mir sind Buttons und die KeyEvents auf bei unterschiedlichen Panels hinzugefügt, bei dir sind die KeyEvents und ButtonEreignisse ja auf einem Panel. Musst du dewegen nicht den Fokus mit requestFokus() ändern
Welche Klasse ( oder auch mehrere Klassen ) die Events verarbeitet spielt da keine Rolle.
left.addKeyListener(this);
right.addKeyListener(this);
addKeyListener(this);
Bei meinem Beispiel habe ich die zwei Buttons und den GamePanel als Listener eingetragen. Das bedeutet, wenn man auf einen Button klickt erhält dieser zwar den Focus. Da er aber auch als KeyListener registriert ist werden die KeyEvents trotzdem verarbeitet.
Wenn du so etwas wie ein Spiel machen möchtest. Solltest Du nur einen JPanel verwenden. Alle grafischen Ausgaben werden in ein Image gezeichnet und das wird dann als Ganzes ausgegeben. (Siehe obigen Code).
Außerdem ist es keine gute Idee einen JFrame in ein Klasse zu packen. Der JFrame sollte die benötigen Klassen beinhalten und nicht umgekehrt.
 

Java xyrse123

Bekanntes Mitglied
OK, danke. Ich habe bisher immer mehrere Panels genommen, also für Buttons und Spielfeld damit ich es besser anordnen kann.
Was meinst du mit JFrame in eine Klasse packen?
Achso, nochmal zu deinem Spiel, mir wurde gesagt das man statt Threads besser Timer verwendet.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Swing Button bleibt grau [=> UI hat sich aufgehängt, Aufgabe in Thread auslagern] AWT, Swing, JavaFX & SWT 3
B Über SWT Button Thread beenden AWT, Swing, JavaFX & SWT 2
C Problem beim Ausführen von Thread per Button AWT, Swing, JavaFX & SWT 2
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
N JFrame loescht alles, sobald der Thread zuende ist AWT, Swing, JavaFX & SWT 22
M Server/Client thread von GUI Trennen AWT, Swing, JavaFX & SWT 2
K JavaFx, Sound Aufnahme und Thread AWT, Swing, JavaFX & SWT 0
T Exception in thread "main" java.lang.NoClassDefFoundError AWT, Swing, JavaFX & SWT 4
G Exception javafx Thread -> caused by removing children while in EventHandler AWT, Swing, JavaFX & SWT 28
H Event Handling Thread - Abruf der get-Methode AWT, Swing, JavaFX & SWT 5
J "Exception in thread "AWT-EventQueue-0"" Fehler AWT, Swing, JavaFX & SWT 3
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
C Thread verwalten AWT, Swing, JavaFX & SWT 2
A Swing Exception in thread "AWT-EventQueue-0" AWT, Swing, JavaFX & SWT 1
S JavaFX Exception in thread "JavaFX Application Thread" AWT, Swing, JavaFX & SWT 3
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Alert Confirmation Dialog aus einem Service Thread AWT, Swing, JavaFX & SWT 8
ralfb1105 JavaFX MVC: Thread in Model Class mit Ausgabe in TextArea AWT, Swing, JavaFX & SWT 10
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
J Thread kennt JButton nicht. AWT, Swing, JavaFX & SWT 11
T JavaFX Task / Thread / FXThread Komplikationen AWT, Swing, JavaFX & SWT 5
O Swing Event Dispatch Thread AWT, Swing, JavaFX & SWT 1
L JavaFX UI Thread block AWT, Swing, JavaFX & SWT 13
X Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: -1 AWT, Swing, JavaFX & SWT 6
sandaime Swing Thread für CMD auslesen AWT, Swing, JavaFX & SWT 16
E JavaFX JavaFX Application in Thread ausführen AWT, Swing, JavaFX & SWT 1
D JavaFX UI-Thread und DB-Thread trennen um z.B. Ladebalken anzuzeigen AWT, Swing, JavaFX & SWT 15
T JavaFX Controller im extra Thread AWT, Swing, JavaFX & SWT 0
T Swing 2 Thread.sleep parallel laufen lassen AWT, Swing, JavaFX & SWT 4
L Zweites Fenster mit Thread AWT, Swing, JavaFX & SWT 0
E JavaFX Stage.show() in ursprünglichem Thread starten AWT, Swing, JavaFX & SWT 7
L Swing Frame in Thread wird nicht gezeichnet AWT, Swing, JavaFX & SWT 2
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
C Im ActionListener Buttons disablen, einen Thread starten, dann Buttons enablen AWT, Swing, JavaFX & SWT 2
C Thread-/ Simulations- Problem AWT, Swing, JavaFX & SWT 18
M Thread-Frage in SWT AWT, Swing, JavaFX & SWT 1
Q GUI außerhalb GUI-Thread updaten - GUI friert ein AWT, Swing, JavaFX & SWT 18
C Thread in Klassen starten AWT, Swing, JavaFX & SWT 4
L exception in thread awt-eventqueue-0 java.lang.nullpointerexception AWT, Swing, JavaFX & SWT 2
S Swing Exception in thread "AWT-EventQueue-0" bei Jlabel AWT, Swing, JavaFX & SWT 4
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
K JavaFX Tableview mit fxml ohne Aktualiserung trotz Thread AWT, Swing, JavaFX & SWT 13
K Event Handling 2 Buttons und Thread stop AWT, Swing, JavaFX & SWT 3
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
V JLabel bzw. GUI aus externen Thread ansteuern AWT, Swing, JavaFX & SWT 3
J Applet Paralleles Thread Handling AWT, Swing, JavaFX & SWT 3
H Swing JfreeChart aktualisieren - mit daten aus thread AWT, Swing, JavaFX & SWT 3
T Java Swing Main GUI Thread AWT, Swing, JavaFX & SWT 3
C Event Handling Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException AWT, Swing, JavaFX & SWT 43
T Table-Zeilen mit Thread einfärben AWT, Swing, JavaFX & SWT 15
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
Y KeyListener, GUI Thread, repaint AWT, Swing, JavaFX & SWT 7
V Nullpointerexception (etwas mit thread und jframe) AWT, Swing, JavaFX & SWT 3
P Problem Thread.sleep() und JProgressBar AWT, Swing, JavaFX & SWT 7
S SWT GUI-Thread AWT, Swing, JavaFX & SWT 11
A Thread und sleep(1000); AWT, Swing, JavaFX & SWT 7
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
S Timer oder Thread.sleep AWT, Swing, JavaFX & SWT 3
M Exception in thread "Thread-3" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 18
C SWT Gui Thread hängt sich auf AWT, Swing, JavaFX & SWT 3
lumo SWT Exception in thread "main" org.eclipse.swt.SWTError: No more handles AWT, Swing, JavaFX & SWT 3
Luk10 Swing Problem mit Zeichen-Thread AWT, Swing, JavaFX & SWT 8
G 2D-Grafik Von Thread aus Zeichnen AWT, Swing, JavaFX & SWT 5
U Swing JLabel bewegen mittels Thread AWT, Swing, JavaFX & SWT 3
M JProgressBar für einen Thread AWT, Swing, JavaFX & SWT 14
R JTable und Thread AWT, Swing, JavaFX & SWT 4
K Thread.sleep in GUI AWT, Swing, JavaFX & SWT 4
J Thread funktioniert nicht AWT, Swing, JavaFX & SWT 10
D JPanel mit Thread in JPanel AWT, Swing, JavaFX & SWT 4
F Exception in thread "AWT-EventQueue-0" java.lang.NumberFormatException: null AWT, Swing, JavaFX & SWT 5
P Teil einer Swing GUI in eigenem Thread AWT, Swing, JavaFX & SWT 4
S Thread.sleep() in einer methode fürs zeichen AWT, Swing, JavaFX & SWT 3
O JTree/TreeModel/DefaultMutableTreeNodes thread safe machen AWT, Swing, JavaFX & SWT 3
P repaint während Thread läuft AWT, Swing, JavaFX & SWT 9
F SWT table refresh per Thread AWT, Swing, JavaFX & SWT 2
V Swing remove(Component) blockiert Thread sehr lange. AWT, Swing, JavaFX & SWT 6
J AWT Artefakte bei AWT-Rendering durch parallelen Thread AWT, Swing, JavaFX & SWT 4
H Thread-Problem mit der Darstellung beim Sperren des Fensters AWT, Swing, JavaFX & SWT 2
T Event Dispatch Thread und noch ein Thread AWT, Swing, JavaFX & SWT 7
Burny91 Swing Thread mit wait() und notify() steuern AWT, Swing, JavaFX & SWT 22
N SWT - über Thread Composite erstellen und Anhängen AWT, Swing, JavaFX & SWT 6
K Vom Gui aus auf einen Thread warten AWT, Swing, JavaFX & SWT 4
X Problem bei JTextArea und Thread.sleep() AWT, Swing, JavaFX & SWT 8
F Merkwürdiges Verhalten zeichnen sperater Thread AWT, Swing, JavaFX & SWT 13
B Swing Swing und Thread.sleep() AWT, Swing, JavaFX & SWT 6
N Exception Behandlung mit setDefaultUncaughtExceptionHandler, insbesondere im EventDispatcher Thread AWT, Swing, JavaFX & SWT 4
Q Neuer Thread zum Öffnen AWT, Swing, JavaFX & SWT 2
P Swing GUI im Thread? AWT, Swing, JavaFX & SWT 5
T GUI JFrame - neuer Thread AWT, Swing, JavaFX & SWT 2
data89 Was mache ich mit "Dispatched Event Thread"/Substance falsch? AWT, Swing, JavaFX & SWT 4
0x7F800000 Allg. Frage zum ev. dispatch thread, wie korrekt auf reaktion der Listener warten? AWT, Swing, JavaFX & SWT 4
S Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException AWT, Swing, JavaFX & SWT 7
T thread.sleep Sprung Problem AWT, Swing, JavaFX & SWT 24
N Server mit Thread und Statusbox AWT, Swing, JavaFX & SWT 3
S Objektverhalten in einen Thread legen AWT, Swing, JavaFX & SWT 4
G JProgressBar actionPerformedMethode und SwingUI thread AWT, Swing, JavaFX & SWT 36
E Komponenten in Event Dispatch Thread erzeugen? AWT, Swing, JavaFX & SWT 4
J Thread in GUI einbauen AWT, Swing, JavaFX & SWT 2
Lony AbstractTableModel Exception in thread "AWT-EventQueue- AWT, Swing, JavaFX & SWT 3
A Ticker als Thread AWT, Swing, JavaFX & SWT 3

Ähnliche Java Themen

Neue Themen


Oben