trotz setSize keine breite

AcE(swiss)

Mitglied
Folgendes Problem:

Wenn ich bei meinem GUI nach während der Initialisierung das setVisible(false) ausführe und später die
die Breite vom Fenster abfage, kommt dort immer 0 raus.

Das GUI erbt von JPanel und hat ein JFrame namens mainWindow. Die Ausgabe this.getWidth ist 0, falls mainWindow.setVisible(false) ausgeführt wurde und 1150 wenn ich mainWindow.setVisible(true) mache.

Ich möchte aber das Fenster erst nach der Initialisierung des Hauptthreads sichtbar machen. Diese dauert auf Grund vieler (zugegeben nicht komprimierter) Bilder unt Töne bis zu 2 Sekunden.

Egal ob ich mainWindow / this.setSize mache, mit einem setVisible(false) wird nur immer nur die eine Grösse gesetzt... versteh ich gar nicht

WARUM wird die Grösse / Breite nicht gesetzt wenn ich es nicht sichtbar mache?
ich seh den Wald voller Bäume nicht mehr..

aadiöööööö
 
Wenn ich es recht verstehe: ja, das ist ein Problem.

.setSize() geht hoch bis nach java.awt.Component und ruft dort ein .resize() auf. Mangels Sichtbarkeit kann das Resize aber nicht durchgeführt werden (da war irgendwas... lang lang ists her) und man läuft gegen die Wand weil .size() noch alte Werte hat (oder garkeine Werte).

Ich glaube, dass ich mir damals für AWT meinen eigenen Frame als Subklasse gebaut habe der die gesetzte Größe zwischengespeichert hat für den Fall, dass die Komponente noch nicht gerendert werden kann.

Für Dein Problem würde ich vorschlagen, dass Du das Fenster einfach anzeigst (eventuell .pack() aufrufen) und einen Progressbar für das Laden der Items anzeigst.

Bernd
 
Also ich kann bei bestem Willen dein Problem nicht rekonstruieren. Vielleicht solltest du ein bisschen Code posten.
Vielleicht noch eine Frage: Erstellst du deinen Frame auf dem EDT?
 
oke, also nochmal von vorn:

Ich hab, unter anderem, einen Hauptthread welcher für das Berechnen, Bewegen und Zeichnen der Objekte zuständig ist und ein Fenster, in welches die Szenerie gezeichnet wird.
Das Fenster wird dabei durch eine Klasse SpielfeldGui, welches von JPanel erbt, realisiert. In Hauptthread PlayGrouse lade ich alle Bilder und Sounds in die Bibliotheken und erstelle die Instanz von SpielfeldGui mit den Bibliotheken. Das laden der Bilder und Sounds dauert noch an, während das Fenster bereits angezeigt wird.

Da ein Spielstart zu diesem Zeitpunkt nicht funktioniert wollte ich das Fenster wohl erstellen, aber noch nicht anzeigen --> setVisible(false) beim Erstellen des gamePanels. Darum plante ich im Hauptthread ein gamePanel.start() welche ein setVisible auf das JFrame ausfÜhrt. Nur leider funktioniert das Spiel in meiner so gestalteten Konstelation nicht, wenn ich bei der Initialisierung von JFrame setVisible(false) mache, da dann Höhe und Breite den Wert 0 haben.

Darum habe ich das nun so gelöst, dass das Fenster wohl sichtbar ist, aber eine progressbar dargestellt wird, bis die Initialisierung abgeschlossen ist.

Das klingt nun vielcht extrem kompliziert, aber leider ist es nun so gestaltet.

Erste Initialisierung vor dem eigentlichen Spielstart:

Java:
public class PlayGrouse extends Thread{

           private SpielfeldGui gamePanel;
 
           private void initializeFirstUse() {

		setPicLib(new PictureLibrary());
		setSoundLib(new SoundLibrary());
		gamePanel = new SpielfeldGui(this, getSoundLib());
		setRoundFinished(false);
	}

Erstellung der Instanz von SpielfeldGui:

Java:
public SpielfeldGui(PlayGrouse newGame, SoundLibrary soundLib){

		// Menuebar Verursacht Offset von 22 pt
		this.currentGame = newGame;
		this.soundLib = soundLib;
		roundFinished = false;

		amountOfMunition = maxAmountOfMunition;
		getMenuBar();

		// Positionierung
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		int top = (screenSize.height - mainWindow.getSize().height)/2;
		int left = (screenSize.width - mainWindow.getSize().width)/2;

		// Mauszeiger ausblenden auf JPanel
		setCursor(java.awt.Toolkit.getDefaultToolkit().createCustomCursor(new BufferedImage(1,1,BufferedImage.TYPE_4BYTE_ABGR),new java.awt.Point(0,0),"NOCURSOR"));
		
		// Hauptfenster
		mainWindow = new JFrame(PlayGrouse.version);
		mainWindow.setLayout(new BorderLayout());
		mainWindow.add(menuBar, BorderLayout.PAGE_START);
		mainWindow.setSize(1150,800);
		mainWindow.add(this);				//	Als JPanel darf nicht irgendein JPanel verwendet werden sonder NUR eine Instanz von SpielfeldGui!!!
		mainWindow.addKeyListener(this);
		mainWindow.addWindowListener(this);
		mainWindow.addMouseListener(this);
		mainWindow.setLocation(left, top);
		mainWindow.setResizable(true);
		
		// Initialisierungsbildschirm anzeigen
		getStartView();		
		
		mainWindow.setVisible(true);
	}

Da das Platzieren der Moorhühner von der Breite des Spielfelds abhängig ist, darf diese eben nicht 0 sein.

Ich hoffe, es ist so etwas verständlicher erklärt worden 😉
 

Zurück
Oben