Hallo,
ich hab in den Weiten des Webs keine Lösung für mein Problem gefunden, dh. die Lösung funktioniert nicht, finden tut man viel. Es geht mal wieder um das leidige Thema repaint().
Mein Szenario:
Beim Spielstart wird das Hauptfenster StartFrame gestartet. Dieses hat 2 JPanels einen oberen für die Graphik und einen unten für die Steuerungselemente, die aber von außen gesetzt werden, da sie im Spielvelauf ausgetauscht werden sollen. So weit so gut. Was nicht funktioniert, ist, dass ich dem StartFrame ein JPanel zuweise, dieses trotz
und
nicht angezeigt wird.
Dazu der Code:
Da ich ein neues
dem Fenster hinzufüge, so muss doch
und
reichen. Oder lieg ich falsch? (OK, ich weiß ich lieg falsch, aber wo?)
Hoffe, dass jemand es besser weiß, als ich und sorry, für die Umstände.
ich hab in den Weiten des Webs keine Lösung für mein Problem gefunden, dh. die Lösung funktioniert nicht, finden tut man viel. Es geht mal wieder um das leidige Thema repaint().
Mein Szenario:
Beim Spielstart wird das Hauptfenster StartFrame gestartet. Dieses hat 2 JPanels einen oberen für die Graphik und einen unten für die Steuerungselemente, die aber von außen gesetzt werden, da sie im Spielvelauf ausgetauscht werden sollen. So weit so gut. Was nicht funktioniert, ist, dass ich dem StartFrame ein JPanel zuweise, dieses trotz
Code:
validate()
Code:
repaint()
Dazu der Code:
Java:
package game.gui;
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public final class StartFrame extends JFrame {
public static final int WIDTH = 480;
public static final int HEIGHT = 320;
private static final String TITLE = "RPG Game";
private static final StartFrame FRAME = new StartFrame();
private JPanel screen;
private JPanel touchScreen;
private StartFrame() {
this.setSize(WIDTH, 2*HEIGHT);
this.setLocationRelativeTo(null);
this.setTitle(TITLE);
this.setResizable(false);
this.setUndecorated(true);
this.screen = new JPanel(); [COLOR="Green"]// Hier werden sie schon mal instatiiert[/COLOR]
this.touchScreen = new JPanel();
this.add(this.screen, BorderLayout.NORTH);
this.add(this.touchScreen, BorderLayout.SOUTH);
this.setVisible(true);
}
public static void initialize() { }
public static void setMainScreen(JPanel panel) {
FRAME.screen = panel;
// FRAME.screen.validate();
// FRAME.screen.repaint();
FRAME.validate(); [COLOR="Green"]// Sollte doch reichen - oder?[/COLOR]
FRAME.repaint();
}
public static void setTouchScreen(JPanel panel) {
FRAME.touchScreen = panel; [COLOR="Green"]// Wird wie setMainScreen() sein, wenn es oben funktioniert[/COLOR]
}
}
Java:
package game;
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.JLabel;
import javax.swing.JPanel;
import game.gui.StartFrame;
// Viel Testcode
public final class Game {
public static void main(String[] args) throws Exception {
StartFrame.initialize();
System.out.println("Sleep");
Thread.sleep(2000);
System.out.println("Set new panel");
JPanel panel = createPanel();
panel.setBackground(new Color(255, 200, 200));
StartFrame.setMainScreen(panel);
System.out.println("Finished");
}
private static JPanel createPanel() {
Dimension size = new Dimension(StartFrame.WIDTH, StartFrame.HEIGHT);
JPanel panel = new JPanel();
panel.setSize(size);
panel.setPreferredSize(size); [COLOR="Green"]// Erzwingt, dass das Panel so groß ist, wie das Fenster (mit halber Höhe)[/COLOR]
[COLOR="Green"]// Ein bisschen was zum Füllen[/COLOR]
for (int i = 0; i < 20; i++) {
panel.add(new JLabel(" " + i));
}
return panel;
}
}
Da ich ein neues
Code:
Component
Code:
validate()
Code:
repaint()
Hoffe, dass jemand es besser weiß, als ich und sorry, für die Umstände.