Jpanel.setResizable(false); funktioniert nur teilweise!

Hey Leute!

Bei dem Online Modus meines Spieles möchte ich, dass das Fenster bei beiden Spielern genau die selbe Größe hat. Also schicke ich jeweils von beiden Spielern ein Paket mit der Maximalgröße des Bildschirms (später vielleicht etwas verbessert zb. weniger Höhe oder so).

Ist die Maximalgröße des Fensters des anderen Spielers kleiners als die Maximalgröße des eigenen Fensters, so soll das eigene Fenster auf die Maximalgröße des Fensters des anderen Spielers gesetzt werden.

Dh. wenn zb. Hans einen kleineren Bildschirm hat als ich, so wird das Fenster des Spieles bei mir verkleinert (auf die Größe von Hans Bildschirm).

Ich war eigentlich schon fast fertig mit diesem System aber dann ist mir ein “Bug” aufgefallen: Selbst wenn ich die JFrame auf setResizable(false); setze ist es immer noch verkleinerbar. Das funktioniert durch einen Windows “Glitch”.
Wenn das Fenster maximiert ist, und ich es dann von dem Rand des Bildschirms entferne wird es automatisch von Windows verkleinert.
Das habe ich hier auch aufgenommen:
Link

Wieso ich das mache?

Gerade ist das Spiel etwas verbuggt wenn beide Spieler verschiedene Fenstergrößen haben weil X und Y koordinaten hin- und hergeschickt werden.
Ich könnte das auch beheben indem ich zb. die Distanz der beiden Spieler verschicke oder die Distanz zur Mitte des Spielfeldes aber das wäre zum Einen ungeschickt und zum Anderen später bei anderen Online Modis nicht mehr sinnvoll. Noch dazu wäre es auch einfach doof wenn ein Spieler auserhalb des Sichtfeldes des anderen Spielers agieren könnte.

Meine bisherigen Lösungsversuche:

Mit “Gewalt” verhindern dass das Fenster vergrössert wird. Funktioniert aber nicht.

		Dimension d = new Dimension(width, height);
		panel.getJFrame().setMaximumSize(d);
		panel.getJFrame().setMinimumSize(d);
		panel.setMaximumSize(d);
		panel.setMinimumSize(d);```

Sobald das Fenster vergrößert/verkleinert wird, es wieder zurücksetzen (hat aber auch nicht geklappt):

		f (e.getComponent().getSize().getHeight()>max_height){
			e.getComponent().setSize((int) e.getComponent().getSize().getWidth(),max_height);
		}

		if (e.getComponent().getSize().getHeight()>max_width){
			e.getComponent().setSize(max_width,(int) e.getComponent().getSize().getHeight());
		}

und ich habe auch schon ein bisschen mit Layouts herumexperimentiert, aber das hat auch nicht geklappt...

Habt ihr vielleicht noch irgendwelchen Ideen?

Hast du mal JFrame.setResizable gesetzt?

Jap. Das war mein erster Versuch (Siehe Video/Überschrift)

War mit Tapatqlk online und hab die Ueberschrift nicht ganz lesen koennen… Sorry :smiley:

Wieso macht du JPanel.setResizable(false); ?
Du musst das mit dem JFrame machen, weil das panel nur aufm dem Jframe sitzt und kein eigenes fenster hat/ist.

Mfg Richi

[QUOTE=XxXRichiXxX]Wieso macht du JPanel.setResizable(false); ?
Du musst das mit dem JFrame machen, weil das panel nur aufm dem Jframe sitzt und kein eigenes fenster hat/ist.

Mfg Richi[/QUOTE]

Oh… die Überschrift ist schlecht xD

Ich habe schon alles mögliche getestet. Auch JFrame.setResizable(false); (ist auch im Video).

Aber danke für die Antwort :slight_smile:

Wieso das setResizable(false) hier nicht funktioniert, keine Ahnung.
Wieso müssen die Fenster beider Spieler gleich groß sein?
Ich würde das Spiel im Fullscreen Mode laufen lassen. Unabhängig davon würde den bei Bedarf den Inhalt in der Größe fest setzen.

[QUOTE=Unregistered]Wieso das setResizable(false) hier nicht funktioniert, keine Ahnung.
Wieso müssen die Fenster beider Spieler gleich groß sein?
Ich würde das Spiel im Fullscreen Mode laufen lassen. Unabhängig davon würde den bei Bedarf den Inhalt in der Größe fest setzen. [/QUOTE]

An sich ist die Fenstergröße nicht veränderbar. Wenn man aber (wie bei dem Video) das Fenster vom Rand wegzieht verkleinert es Windows irgendwie. Das liegt wahrscheinlich nicht an Java…

Und die Fenster beider Spieler müssen gleich groß sein, weil die Größe des Spielfeldes so groß wie das Fenster ist.
Wenn beide Spieler verschiedene Fenstergrößen haben ist alles verbuggt. Das könnte ich zwar beheben (wäre aufwendig) aber bei anderen Modi die ich für die Zukunft geplant habe würde es dann wieder nicht funktionieren.
Und es wäre unfair wenn ein Spieler ein größes Feld hätte und dann auserhalb des sichtbaren Bereiches des anderen Spielers könnte.
Bei dem Spieler mit dem kleineren Bildschirm soll es in Fullscreen Mode laufen und bei dem anderem Spieler verkleinert.

Naja, wie waers denn wenn du das ganze beim typ mit dem groesseren bildschirm eim fach entsprechend skalierst…

Was genau hat nicht geklappt beim gewaltsamen zuruecksetzen der groesse? Wird die methode ue erhaupt ausgefuehrt? Vllt geht setSize() ja gar nicht, wenn resizable false ist

[QUOTE=mymaksimus]Naja, wie waers denn wenn du das ganze beim typ mit dem groesseren bildschirm eim fach entsprechend skalierst…

Was genau hat nicht geklappt beim gewaltsamen zuruecksetzen der groesse? Wird die methode ue erhaupt ausgefuehrt? Vllt geht setSize() ja gar nicht, wenn resizable false ist[/QUOTE]

Wenn alles nicht funktioniert werde ich das wahrscheinlich machen müssen.

Wenn ich die Größe gewaltsam zurückgesetzt habe wurde der Bildschirm schwarz. Bei einem alten Versuch hat er auch mal geflimmert aber den Code davob habe ich nicht mehr gefunden (Ist auch nicht so wichtig weil es sowieso nicht geklappt hat).
Hier ein Video von den weiteren Versuchen und deren Ergebnissen: Link (Falls es nicht sichtbar oder verfügbar ist, wird es immer noch hochgeladen. Sollte bald fertig sein.)

Bildschirm schwarz?
Versuch mal ein repaint () oder invalidate () oder paintimmidiatly () oder wie das geschrieben wird

Mit folgendem Code klappt es auf einmal:

		p.getJFrame().setSize(d);
		p.getJFrame().setMinimumSize(d);
		p.getJFrame().setMaximumSize(d);
		p.getJFrame().setPreferredSize(d);

Ich weiß nicht was ich vorher anders gemacht habe, aber auf jeden Fall geht es jetzt endlich :slight_smile:

haha, freut mich für dich :wink: