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:
StartPanel:
GamePanel:
GameLoop:
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();
}
}
}