Swing "Frame.setResizable(false);" verschiebt Content?

mac21

Aktives Mitglied
Hallo zusammen,

wieder einmal ist ein kleines Problem aufgetaucht, auf das ich keine Lösung fand...
für mein Derzeitiges OCR-Projekt lade ich ein Bild als Hintergrund in ein ImagePanel.
Dieses ImagePanel befindet sich in einem JFrame. (Neben 2 weiteren, normalen JPanels)

Klasse ImagePanel (auf das nötigste beschränkt:
Java:
public ImagePanel{

public ImagePanel(int width, int height, BufferedImage image, GUI gui) {
		
		if(image != null) {this.image = resizeThumb(image);}
	    this.width = width;
	    this.height = height;
	    this.gui = gui;
	    this.addMouseMotionListener(this);
	    this.addMouseListener(this);
	    this.setFocusable(true);
	    
	    gui.mainFrame.addKeyListener(this);
	}

public void paintComponent(Graphics g) {
		super.paintComponent(g);
		if (image != null) {
			g.setColor(Settings.CELLCOLOR);
			g.drawImage(image, 0, 0, width, height, this);
			for(int i = 0; i < rectangles.length; i++) {
				g.drawRect( (int)rectangles[i].getX(), (int)rectangles[i].getY(), (int)rectangles[i].getWidth(), (int)rectangles[i].getHeight());
			}
		}
	}
}

Das ganze sieht dann so aus:
vorher.jpg

Nun ist mir aufgefallen, dass mein JFrame (also mein komplettes GUI) zwar eine feste Größe hat (das war so vorgegeben), diese jedoch veränderbar ist.
Klar, ich bin ja nicht blöd: mainFrame.setResizable(false);

Dann kommt leider folgendes Ergebnis dabei heraus:

nachher.jpg

Wenn man die Bilder direkt vergleicht stellt man fest:
- Nachher ist der Frame einige Pixel höher.
- Auch die Screenshots die ich mit shift-druck (also nur das aktuelle Fenster) gemacht habe unterscheiden sich in der Pixelzahl.
- Des Weiteren verschieben sich die JPanels und deren Inhalte.

Woran könnte das liegen?

Ich kann, falls nötig, gerne auch die kompletten Sourcecodes hochladen,
wird dann nur viel Arbeit sein, alles zu analysieren...

Danke schon mal!
 
Ich fürchte da kannst du wenig machen. das Frame#setResizable(boolean) bedient sich irgendwann bei einer nativen Methode. Man hat also (meines Wissens nach) ab da keine Möglichkeit mehr auf etwas Einfluss zu nehmen.
 
Hallo X5-599,
interessanter nick, btw.

Danke für deinen Beitrag.
Auf diese "Lösung" bin ich schon in vielen Threads gestoßen, im Forum sowie anderen Quellen über google.
Viele Threads waren schon Jahre alt, von daher habe ich gehofft, es gibt "mittlerweile" eine "Lösung".
Leider habe ich sämtliche Frames und Panels mit "setLayout(null)" geschrieben und Location und Size manuell festgelegt,
die die Anwendung eine vorgegebene Pixelbreite und -höhe besitzen sollen.

Leider habe ich auch noch keine Erfahrung mit Layoutmanagern. Habe nur ein wenig rumgespielt... kam aber zu keinem sinnvollen Ergebnis.

Hast du evtl. einen Tipp für mich, WELCHES Layout ich für das in den o.g. Bildern zu sehende Layout verwenden soll?

Mit BorderLayout kam ich nicht klar, da dieses ja in 5 Bereiche (N, O, S, W, und center) geteilt wird. Mein Layout passt in dieses Schema nicht rein...


Ich hatte experimentiert mit einem FlowLayout im JFrame.
Ich habe den drei JPanels jeweils feste Maße gegeben, jedoch keine Location.
Dann fügte ich diese Panels dem JFrame hinzu, in der Hoffnung, diese würden (aufgrund Ihrer Maße) selbst richtig geordnet werden.

Ergebnis: das grüne Panel, das rechts am Rand sein sollte, war etwa 10 Pixel breite und am linken Rand.
Alles andere war weiß...
beide anderen Panels fehlten einfach...
 
setzt du bei deinem Frame irgendwo ein .pack() ? und wenn ja vor oder nachdem du das Fenster per .setResizeable(false); unveränderbar gemacht hast ? das macht nämlich nen unterschied und zwar einen unterschied von ca 10 - 15 pixeln 🙂
 
Zuletzt bearbeitet:
Hier einige Links zu LayoutManagern:

Wikipedia -Layoutmanager
tutorialspoint - Swing Layouts
Oracle Tutorial Layouts

LayoutManager können auch verschachtelt werden, so werden "sehr komplexe" Layouts möglich, aber entsprechend komplex ist es dann die Komponenten richtig aufeinander abzustimmen.

Ich glaube in deinem Fall sollte ein GridBagLayout reichen.
2 Spalten und 2 Reihen:
1.Reihe + 1.Spalte = Panel 1
2.Reihe + 1.Spalte = Panel 2
1.+2.Reihe + 2.Spalte = Panel 3
 
Hallo Joose,
und auch in diesem Thread wieder ein "herzlichen Dank".

Unter dem 3. Link
fand ich eine super Beschreibung mit Beispiel.

Wenn ich ein Panel in ein Frame hinzufüge,
zb
Java:
GridBagConstraints c = new GridBagConstraints();
JPanel p = new JPanel();
p. ...
p. ...
p.set ...
...
JFrame.(p, c);

1. Dann gebe ich meiner Komponente (in diesem Fall JPanel p) KEINE Größe und KEINE Position mit?
Diese richtet sich automatisch nach der Gridgröße aus?

2. Wenn ich das richtig verstanden habe, ist das FlowLayout das Standard-Layout?
Füge ich nun noch ein zweites JPanel p2 hinzu, per
Java:
JFrame.(p2, c);

Ist das JPanel p2 nun NEBEN oder UNTER meinem JPanel p?
Beiden haben weder Größe noch Position vorgegeben.
 
Also Layouts sind auch nicht so meine Welt. Sorry. Aber das was kaoZ geschrieben hat funktionierte bei mir. Es hat tatsächlich eine Auswirkung ob das setResizable() vor oder nach dem pack() passiert.
Wenn setResizable() vor dem pack() steht, ändert das Fenster seine Grösse nicht. Es ist dann genauso gross wie als wenn es resizable wäre...
 
Okay kein Thema,
man kann ja nicht alles wissen 😉

das Problem dabei ist, dich rufe gar kein "pack()" auf..
da ich vorher alle Positionen und Größen hardgecoded habe...
 
Wenn du feste Größen verwendest, zieht das toolkit, wie bei einem zu früh Gesetzen pack() augenscheinlich die Pixel für die Rahmen ab, also musst du dies beim setzen der bounds beachten, mal abgesehen davon ist das arbeiten mit null Layout = Evil 😉
 
Zuletzt bearbeitet:
Hallo kaoZ,

danke für die Info,
da ich auch noch relativ wenig mit Layoutmanagern gemacht habe, somit kein pack() verwendet habe,
ist mir dieses Phänomen noch nicht unter gekommen.
Bei meinen bisherigen "Programmen" war es kein Problem, das Fenster größer zu ziehen.
Doch dieses mal sollen bestimmte Inhalte, zB. ein Panel, eine feste Pixelbreite haben.
Ich werde das Projekt mal pausieren,
mich in die Layouts einlesen und das ganze mit einem neuen UI versehen.

Vielen Dank für die Hilfe!
 

Zurück
Oben