JComponent Größe

Alenka87

Mitglied
Hallo zusammen,

ich bin grad auf ein "Problemchen" gestoßen, das mich echt aus dem Konzept gebracht hat :bahnhof:

Man stelle sich vor: Eine kleine Software mit JGoodies für die GUI.

Die Oberflächen bauen also auf JComponent auf. Alles ganz net bis auf die Aufgabe: Die Fenster in ihrer Größe fixieren, net das der Anwender aus langweile anfängt, mit fenstergröße zu spielen. 😀

Ich dachte erst ma, "Supi" - ist ja in einer Zeile mit setResizable(false) machbar, aber nix da ???:L So was funktioniert mit einem JComponent wohl nicht.

Dann bin ich einen langen Weg gegangen:Ein Fenster kriegt seine prefferedSize, dann Listener hinzufügen, der auf Größenverändeurngen reagiert und das Fenster zurück in die gewünsche Größe befördert.

Java:
@Override
	public void componentResized(ComponentEvent e) {
		if(view!=null){
			int actualHigh = (int) view.getPanel().getSize().getHeight();
			int actualWidth = (int) view.getPanel().getSize().getWidth();
			int preferredHigh = (int) view.getPanel().getPreferredSize().getHeight();
			int preferredWidth = (int) view.getPanel().getPreferredSize().getWidth();

			if(actualHigh != preferredHigh || actualWidth != preferredWidth){
view.getPanel().setSize(preferredWidth, preferredHigh);
				view.getPanel().validate();
				view.getPanel().repaint();
			}

		}
	}

Also: Listener reagiert. Dank dem Debbug habe ich auch gesehen, dass veränderte größe erkannt wird. Neue (preffered) Größe wird gesetzt. Aber es ist nicht zu sehen.

Java:
int high = 500;
int width = 400;

Dimension d = new Dimension(width, high);
component.setMinimumSize(d);
component.setMaximumSize(d);
component.setPreferredSize(d);
auch das wird ignoriert....

Hab da schon so ziemlich alles ausprobiert. Aber es will nicht.

Dann wurde mir auch noch gesagt, dass das mit dem Listener eine sehr schlehte Lösung ist. Ok... ist wohl nicht gut für die performance, wenn bei mehreren Dialogen immer Listener mitlaufen müssen.
Dennoch:

ich stehe vor dem "Problemchen" - warum solche Sachen wie minimale bzw. maximale Größe festlegen ignoriert werden und warum setSize nicht klappt. :autsch:

Und die eigentliche Frage: ist es möglich die Größe des Fensters zu fixieren??????:L

was mir grad spontan eingefallen ist: Gibt es vielleicht was JGoodies-spezifisches für so ein Fall?
DAnke im Vorraus!!!!
 
Ich gebs zu, ich kenn die JGoodies nicht, aber setResizable sollte bei JComponent trotzdem funktionieren.

Java:
private static void showGui() {
	JFrame frame = new JFrame();
	frame.setSize(100, 100);
	frame.setContentPane(new JComponent() {});
	frame.setResizable(false);
	frame.setVisible(true);
}

Die Pref. Size hat nichts mit der Größe des Fensters zu tun. JFrames richten sich auch nur bei pack daran. Wenn es wirklich nicht funktioniert würde ich die Änderung direkt am Fenster (setSize) durchführen und nicht die Pref. Size des Childs setzen.

(Die Pref. Size sollte eigendlich garnicht gesetzt werden, das soll der LayoutManager für einen erledigen.)
 
setResizable() funktioniert beim JFrame und bei JDialog, aber nicht bei JComponent oder JPanel.

Bei uns wird nur das Hauptfenster auf JFrame aufgebaut, alle weiteren Dialoge (z.B. Eingabedialoge, Fehlermeldungen...) basieren auf JComponent/JPanel.
Ich verstehe selbst nicht so ganz, bin noch nicht ganz eingestiegen. Habe schon ganzes Workspace durchgesucht, ob ich nicht irgendwo dem JFrame die Größe fixieren kann. Aber das klappt nur im hauptfenster. Alle weiteren Dialogfenster können trotzdem noch in der Größe verändert werden 🙁
 
das weiss ich ja.... nur sitze ich erst seit einem Monat an einem Projekt, das schon seit über 2 Jahren läuft und hab noch nicht überall Überblick.

Vielleicht habt ihr einen Tip, wie ich nach entsprechenden Stellen suchen kann?
Abgeleitete Klassen und "References in Workspace" durchforsten hat mich nicht weiter gebracht.
 
Heißt Du findest die Window Objekte nicht? Grundsätzlich könnte man den Source Code auf Verdacht nach JFrame, JDialog... durchsuchen, oder sich über die Referenzen "hochhangeln".
Per Code bekommt man mittels
Code:
getTopLevelAncestor()
an der Komponente eine Referenz auf das Fensterobjekt, sofern die Komponente bereits in dem Objekt verbaut ist.
 
mit getTopLevelAncestor() :
Code:
Component comp = view.getPanel().getTopLevelAncestor() ;
sehe im beim Debugging: comp = null ???:L
 
Dann ist die Komponente (zu diesem Zeitpunkt noch) nicht in einem Fenster verbaut.
view ist eine eigene Klasse, die als Attribut das Panel enthält?
 
Die Abfrage nach dem Container mache ich an der Stelle, wo auch der Listener hinzugefügt wird:

Java:
view.getPanel().addComponentListener(this);
Container c = view.getPanel().getTopLevelAncestor();

Mit dem Listener funktioniert es ja, also muss die Komponente schon exsistieren. (der Listener funktioniert so weit, dass er erkennt, wenn die Größe des Fensters verändert wurde, sieh erster post)

Mir sit das alles rätzelhaft. Über Referenzen hochhangeln hat mich auch nirgendswochin geführt. Ich lande irgendwann bei den klassen, die ich nicht merh bearbeiten kann. aber auch da sehe ich überall nur JComponent und JPanel.

Und wenn ich versuche über References rauszufinden, wo JDialog und JFrame verwendet werden, krieg eich nur die Klassen, die von JGoodies abgeleitet sind und zu internen JARs gehören, die ich auch nicht editieren kann.

Kann so was sein? Kann es sein, dass ich echt so tief ins System greifen muss, um so ein lächerliches Problemchen zu lösen?

____
Ja,
Code:
View
ist eine klasse für sich, die das JComponent enthält. Auf JComponent werden alle Elemente platziert (Textfelder, Buttons...) und in dieser Klasse geschieht auch das DataBinding(--> JGoodies)
 
Zuletzt bearbeitet:

Neue Themen


Zurück
Oben