Swing GUI aktualisiert nicht richtig

Kobold137

Mitglied
Wie der Titel schon beschreibt, aktualisiert meine GUI nicht richtig.
Ich bin dabei ein kleines Spiel zu programmieren.

Mein Programm ist so aufgabaut, dass ich ein JFrame habe. Zu beginn, adde ich ein JPanel mit JButtons. Jeder JButton besitzt die Aufgabe ein anderes Panel in dem JFrame anzuzeigen. Dies funktioniert auch soweit, bis ich über einen Button zuerst ein JPanel dem JFrame hinzufüge und dann eine Endlosschleife für den GameLoop starte. Starte ich die Schleife, so bleibt das Anfangspanel im neu erstellten sichtbar.

Ich habe schon die invalidate-Methode ausprobiert. Dies hilft leider nichts.

JFrame-Klasse:
Java:
package GUI;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

import GameLogic.GameLoop;
import Player.Player;

public class GameFrame extends JFrame{
  
    protected static boolean win = false;
    protected SPanel p;
    protected Player p1;
    protected Player p2;
    protected GameLoop gl;
  
    public GameFrame(int width, int height){
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        p = new StartPanel(300,100,this);
        add(p);
        JMenuBar jmb = new JMenuBar();
        setJMenuBar(jmb);
        addSubmenu(jmb);
    }
  
    public void startGame(){
        gl = new GameLoop();
        gl.run();
    }
  
    public void initialPlayer(){
        p1 = new Player("test");
    }
  
    public void addSubmenu(JMenuBar jmb){
        JMenu JMOption = new JMenu("Optionen");
        jmb.add(JMOption);
        JMenuItem JMIClose = new JMenuItem("Beenden");
        JMIClose.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        JMenuItem JMIBack = new JMenuItem("Zurück");
        JMIBack.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                getContentPane().remove(0);
                p = new StartPanel(300,100);
                add(p);
                align();
            }
        });
        JMOption.add(JMIClose);
        JMOption.add(JMIBack);
    }
  
    public void setP(SPanel panel){
        this.p = panel;
    }
  
    public void align(){
        pack();
        setLocationRelativeTo(null);
        repaint();
    }

}

StartPanel:
Java:
package GUI;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

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

public class StartPanel extends SPanel{

    private static final long serialVersionUID = 5890557562020940174L;
    protected static int WIDTH;
    protected static int HEIGHT;
    protected static GameFrame gf;
    protected StartPanel sp;
   
    public StartPanel(int width, int height){
        this(width,height,gf);
    }
   
    public StartPanel(int width, int height, GameFrame gframe){
        this.WIDTH = width;
        this.HEIGHT = height;
        gf = gframe;
        sp = this;
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        setLayout(new BorderLayout());
        JPanel bPanel = new JPanel();
        bPanel.setLayout(new GridLayout(2, 1));
        JButton start = new JButton("Start");
        start.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                gf.getContentPane().remove(0);
                invalidate();
                 gf.setP(new GamePanel(500,500,sp));
//                 gf.align();
                 gf.startGame();
            }
        });
        bPanel.add(start);
        JButton settings = new JButton("Spiel-Optionen");
        settings.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                gf.getContentPane().remove(0);
                gf.setP(new SettingsPanel(300,300,sp));
            }
        });
        bPanel.add(settings);
        add(bPanel, BorderLayout.CENTER);
       
    }
   
    public void fix(SPanel panel){
        gf.add(panel);
        gf.align();
    }

}

GamePanel:
Java:
package GUI;

import java.awt.Color;
import java.awt.Dimension;


public class GamePanel extends SPanel{
   
    protected static int WIDTH;
    protected static int HEIGHT;
   
   
    protected int[][] gameField;
   
    public GamePanel(int width, int height, StartPanel sp){
        this.WIDTH = width;
        this.HEIGHT = height;
        gameField = new int[width][height];
        setPreferredSize(new Dimension(WIDTH, HEIGHT));
        sp.fix(this);   
    }
}

GameLoop:
Java:
package GameLogic;

import GUI.GameFrame;

public class GameLoop implements Runnable{
   
    protected boolean isWin;
   
    public GameLoop(){
        isWin = false;
       
    }
   
    public void render(){
       
    }
   
    public void update(){
    }
   
    public void setIsWin(boolean isWin){
        this.isWin = isWin;
    }

    @Override
    public void run() {
        while(!isWin){
            update();
            render();
        }
    }

}
 

Joose

Top Contributor
Du blockierst mit deiner while-Schleife in der Klasse "GameLoop" die GUI.
In der Methode "startGame" erstellst du nur ein GameLoop Objekt und rufst dessen run Methode auf. Stattdessen solltest du aber einen Thread (bekommt als Runnable ein GameLoop Objekt übergeben) erstellen und diesen einfach starten ;)
 

Kobold137

Mitglied
Das hab ich jetzt eingearbeitet. Das Problem, dass nicht mehr richtig aktuallisiert wird ist behoben. Danke vielmals! Da hatte ich wohl einen kleinen Fehler :p

Ich ruf jetzt auf mein Thread-Objekt die Methode .start(); auf. Dem erzeugten Thread-Objekt geb ich per new GameLoop() auch das Objekt mit.

Testweise habe ich in die update()-Methode der GameLoop-Klasse eine Ausgabe reingeschrieben um zu sehen ob diese wirklich läuft. Macht sie leider nicht.
 

Kobold137

Mitglied
Habe nur Änderungen in den zwei nachfolgenden Klassen vorgenommen.

@GameFrame
Java:
package GUI;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

import GameLogic.GameLoop;
import Player.Player;

public class GameFrame extends JFrame{
   
    protected static boolean win = false;
    protected SPanel p;
    protected Player p1;
    protected Player p2;
    protected GameLoop gl;
    protected Thread t;
   
    public GameFrame(int width, int height){
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        p = new StartPanel(300,100,this);
        add(p);
        JMenuBar jmb = new JMenuBar();
        setJMenuBar(jmb);
        addSubmenu(jmb);
    }
   
    public void startGame(){
        t = new Thread(gl = new GameLoop());
        t.start();
       
    }
   
    public void initialPlayer(){
        p1 = new Player("test");
    }
   
    public void addSubmenu(JMenuBar jmb){
        JMenu JMOption = new JMenu("Optionen");
        jmb.add(JMOption);
        JMenuItem JMIClose = new JMenuItem("Beenden");
        JMIClose.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                System.exit(0);
            }
        });
        JMenuItem JMIBack = new JMenuItem("Zurück");
        JMIBack.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                getContentPane().remove(0);
                p = new StartPanel(300,100);
                add(p);
                align();
            }
        });
        JMOption.add(JMIClose);
        JMOption.add(JMIBack);
    }
   
    public void setP(SPanel panel){
        this.p = panel;
    }
   
    public void align(){
        pack();
        setLocationRelativeTo(null);
        repaint();
    }

}

@GameLoop
Java:
package GameLogic;

import GUI.GameFrame;

public class GameLoop implements Runnable{
   
    protected static boolean isWin = false;
   
    @Override
    public void run() {
        while(!isWin){
            update();
            render();
        }
    }

    public void render(){
        System.out.println("render");
    }
   
    public void update(){
        System.out.println("update");
    }
   
    public void setIsWin(boolean isWin){
        this.isWin = isWin;
    }


}
 

Kobold137

Mitglied
Problem wurde gelöst. Danke nochmals an Joose der mir bei meinem Ursprünglichen Problem sehr weitergeholfen hat.

Der letzte Fehler lag daran, dass ich in meinem ActionListener vergessen habe die Methode startGame() aufzurufen :oops:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
F AWT Grafik wird nicht richtig aktualisiert AWT, Swing, JavaFX & SWT 2
R GUI wird nicht richtig aktualisiert AWT, Swing, JavaFX & SWT 5
G Mein JFrame aktualisiert sich nicht richtig AWT, Swing, JavaFX & SWT 3
F JList aktualisiert nicht AWT, Swing, JavaFX & SWT 24
J Meine ProgBar und ProgIndi werden nicht aktualisiert AWT, Swing, JavaFX & SWT 28
M JTextArea wird nicht aktualisiert (ActionListener-Problem) AWT, Swing, JavaFX & SWT 1
J AWT choice mit viel Auswahl aktualisiert sich nicht korrekt beim scrollen?! AWT, Swing, JavaFX & SWT 3
A Vier gewinnt: GUI aktualisiert sich nicht AWT, Swing, JavaFX & SWT 12
T Java Swing Oberfläche aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
J Swing Progressbar aktualisiert sich nicht AWT, Swing, JavaFX & SWT 17
C JLabel wird nicht aktualisiert AWT, Swing, JavaFX & SWT 3
D JTabke aktualisiert sich nicht AWT, Swing, JavaFX & SWT 4
El_Lobo Swing Swing TextArea und JTextField werden nicht aktualisiert AWT, Swing, JavaFX & SWT 2
N Tabellenzelle wird bei JCombBox mit eigenem Datentyp nicht aktualisiert AWT, Swing, JavaFX & SWT 7
N JLabel Text aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
K JTable wird nicht aktualisiert, wenn Filter gesetzt ist AWT, Swing, JavaFX & SWT 9
P Swing GUI aktualisiert sich nicht AWT, Swing, JavaFX & SWT 7
S Jtable wird nicht aktualisiert AWT, Swing, JavaFX & SWT 8
M Graphics-Objekt aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
C Swing JProgressBar Aktualisiert sich nicht. AWT, Swing, JavaFX & SWT 9
C (Swing)GUI-Elemente werden nicht aktualisiert. AWT, Swing, JavaFX & SWT 2
S Swing JList in JScrollPane aktualisiert sich nicht AWT, Swing, JavaFX & SWT 6
C JTree wird nicht aktualisiert AWT, Swing, JavaFX & SWT 3
A Gui Komponenten werden nicht von selbst aktualisiert! AWT, Swing, JavaFX & SWT 2
T JPanel aktualisiert nicht AWT, Swing, JavaFX & SWT 3
C JTable aktualisiert die Anzeige nicht AWT, Swing, JavaFX & SWT 2
G JTable (AbstractTableModel) wird nicht aktualisiert AWT, Swing, JavaFX & SWT 2
J JTextArea wird nicht aktualisiert bei Zugriff von außerhalb AWT, Swing, JavaFX & SWT 2
S JLabel aktualisiert sich nicht AWT, Swing, JavaFX & SWT 4
J Dialogfenster wird nicht aktualisiert/CardLayout AWT, Swing, JavaFX & SWT 6
raptorrs JTextfelder werden in while-Schleife nicht aktualisiert AWT, Swing, JavaFX & SWT 5
L JProgressBar wird nicht mehr aktualisiert AWT, Swing, JavaFX & SWT 2
G Progressbar aktualisiert sich nicht (vernünftig). WIESO? AWT, Swing, JavaFX & SWT 2
S Ausgabe aktualisiert sich nur nach 2. Klick AWT, Swing, JavaFX & SWT 17
F Timer welches JPanel aktualisiert AWT, Swing, JavaFX & SWT 6
R AWT JList wird nur zufällig auf der GUI aktualisiert AWT, Swing, JavaFX & SWT 5
I Swing Warten, bis eine GUI-Komponente aktualisiert ist? AWT, Swing, JavaFX & SWT 4
PAX JList aktualisiert zu langsam beim Hinzufügen von Einträgen AWT, Swing, JavaFX & SWT 6
K Textfeld wird nur jedes zweite Mal aktualisiert AWT, Swing, JavaFX & SWT 3
G JList wird in einem Applet nur teilweise aktualisiert AWT, Swing, JavaFX & SWT 12
A JTree wird erst nach Klick aktualisiert AWT, Swing, JavaFX & SWT 2
G Tabelle aktualisiert sich erst, nachdem man auf sie klickt! AWT, Swing, JavaFX & SWT 4
B TreeViewer für das Dateisystem, der sich selbst aktualisiert AWT, Swing, JavaFX & SWT 8
O Choice/Combobox wird nur 1x aktualisiert AWT, Swing, JavaFX & SWT 3
MiMa Darstellung von FXML ateien nicht korrekt (SceneBuilder) AWT, Swing, JavaFX & SWT 2
P Methode wird nicht überprüft AWT, Swing, JavaFX & SWT 4
C Button ActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
M Mandelbrot mit BigDecimal erstellen und in der UI zeichnen, funktionierte nicht. AWT, Swing, JavaFX & SWT 1
H JavaFX PixelWriter.setColor setzt Farbe nicht AWT, Swing, JavaFX & SWT 2
M JavaFX Diagonale Linie nicht ausgegeben/angezeigt AWT, Swing, JavaFX & SWT 1
M JavaFX Mandelbrot-bild noch nicht optimiert AWT, Swing, JavaFX & SWT 7
Hatsi09 Javafx MediaPlayer spielt nicht immer AWT, Swing, JavaFX & SWT 3
P thread nimmt veränderte boolean nicht AWT, Swing, JavaFX & SWT 7
P Animation läuft nicht korrekt AWT, Swing, JavaFX & SWT 8
P AWT Programm funktioniert nicht richtig AWT, Swing, JavaFX & SWT 35
P JTextField wird nur sehr klein angezeigt und verändert die Größe nicht AWT, Swing, JavaFX & SWT 3
Telisti Javafx Image wird nicht richtig integiert AWT, Swing, JavaFX & SWT 8
J Netbeans die JavaFX-Anwendung wird nicht ausgeführt AWT, Swing, JavaFX & SWT 16
thor_norsk Icons laden nicht in GUI AWT, Swing, JavaFX & SWT 15
N €-Zeichen wird nicht akzeptiert AWT, Swing, JavaFX & SWT 4
tommybalbor JavaFx Anwendung klappt nicht für macOs Nutzern, wenn ich zwei dependecies bei maven hinzufüge AWT, Swing, JavaFX & SWT 6
G JOptionPane zeigt nicht an was ich will AWT, Swing, JavaFX & SWT 2
S JavaFX WebView zeigt bestimmte Websites nicht an AWT, Swing, JavaFX & SWT 2
R auto. Importanweisungen für javafx funktioniert in Eclipse nicht mehr AWT, Swing, JavaFX & SWT 4
berserkerdq2 Anchorpane warum kann ich nicht Anchors setzen AWT, Swing, JavaFX & SWT 6
komplettlost Vollbildmodus für MacOs Nutzer geht nicht AWT, Swing, JavaFX & SWT 13
M Scrollbar funktioniert nicht AWT, Swing, JavaFX & SWT 10
D Repaint Funktioniert nicht AWT, Swing, JavaFX & SWT 2
W JEditorPane textausrichtung nach settext funktioniert nicht mehr AWT, Swing, JavaFX & SWT 11
H JList.setEnabled(false) - Text soll nicht grau sein AWT, Swing, JavaFX & SWT 2
_user_q Objekt.setSelected(false), wenn es nicht mehr fokussiert wird AWT, Swing, JavaFX & SWT 2
sserio JFrame setIconImmage() funktioniert nicht AWT, Swing, JavaFX & SWT 3
R Fxml findet controller nicht AWT, Swing, JavaFX & SWT 2
D Swing Komponenten nicht sichtbar nach Start AWT, Swing, JavaFX & SWT 12
frager2345 Warum paintComponent hier und nicht paint AWT, Swing, JavaFX & SWT 2
_user_q [JavaFX] Spinner so einstellen, dass er nicht leer bleiben darf? AWT, Swing, JavaFX & SWT 6
T Swing Tooltip-Delay funktioniert nicht immer. AWT, Swing, JavaFX & SWT 1
J Programm findet Resource nicht. AWT, Swing, JavaFX & SWT 6
S Javafx getResource-Pfad wird nicht erkannt AWT, Swing, JavaFX & SWT 7
B Swing Menü geht nicht AWT, Swing, JavaFX & SWT 5
B Bild lädt nicht AWT, Swing, JavaFX & SWT 2
princess_sara1997 .jar Datei führt den Code nicht richtig aus AWT, Swing, JavaFX & SWT 19
S Ich bringe Code mit JavaFX unter Apache NetBeans IDE 12.6 nicht zum laufen. AWT, Swing, JavaFX & SWT 14
U Code doch nicht austauschbar in 2DGraphics AWT, Swing, JavaFX & SWT 2
P JavaFX Änderungen am Datenmodell visuell nicht sichtbar AWT, Swing, JavaFX & SWT 3
M JavaFX kann man da noch was am code vereinfachen design technisch sieht nicht richtig aus... AWT, Swing, JavaFX & SWT 15
S ChoiceBox aus ArrayList per setValue() mit Wert belegen funktioniert nicht. AWT, Swing, JavaFX & SWT 0
ProggersWorld JavaFX TextArea BackgroundImage wird nicht angezeigt AWT, Swing, JavaFX & SWT 3
K Textarea aktuallisiert sich nicht, nach Auswahl (Itemlistener) AWT, Swing, JavaFX & SWT 3
G JavaFX Scene ausdrucken nicht möglich, Seite leer AWT, Swing, JavaFX & SWT 5
N Programm Läuft nicht auf anderen Pcs AWT, Swing, JavaFX & SWT 9
izoards Bild ausdrucken - PageFormat setzen geht nicht AWT, Swing, JavaFX & SWT 5
H KeyListener funktioniert nicht AWT, Swing, JavaFX & SWT 1
B Swing JScrollPane scrollt nicht AWT, Swing, JavaFX & SWT 10
H BufferedImage zurücksetzen funktioniert nicht AWT, Swing, JavaFX & SWT 12
H RPG Programmieren, label.setLocation funktioniert nicht AWT, Swing, JavaFX & SWT 7
S e(fx)clipse erscheint nicht im Marketplace, lässt sich nicht installieren AWT, Swing, JavaFX & SWT 16
M Bild wird nicht geladen obwohl sie gefunden wird AWT, Swing, JavaFX & SWT 0
M Nach Export als Runnable Jar wird css nicht merh gefunden AWT, Swing, JavaFX & SWT 22
L JavaFX .fxml laden klappt nicht AWT, Swing, JavaFX & SWT 16

Ähnliche Java Themen

Neue Themen


Oben