Swing Resizen eines JFrames nur relativ zulassen

xehpuk

Top Contributor
Hi! :)

Ich suche gerade nach einer Möglichkeit, die Größe eines JFrames nur relativ verändern zu können.
Hier mal ein Beispiel, um mein Anliegen genauer zu erläutern:
Java:
import java.awt.Dimension;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;

import javax.swing.JFrame;

public class ResizeJFrame extends JFrame {
	private final float scale;
	private Dimension oldSize;
	
	public ResizeJFrame(final int width, final int height) {
		super(width + ":" + height);
		this.scale = width / (float) height;
		
		addComponentListener(new ComponentListener() {
			@Override
			public void componentShown(ComponentEvent e) {}
			
			@Override
			public void componentResized(ComponentEvent e) {
				final Dimension size = getSize();
				final int diffWidth = size.width - oldSize.width;
				final int diffHeight = size.height - oldSize.height;
				final boolean widerThanTaller = Math.round(diffWidth / scale) > diffHeight;
				final boolean wider = diffWidth > 0;
				final boolean taller = diffHeight > 0;
				final int widthToHeight = Math.round(size.width / scale);
				final int heightToWidth = Math.round(size.height * scale);
				final Dimension heightChange = new Dimension(size.width, widthToHeight);
				final Dimension widthChange = new Dimension(heightToWidth, size.height);
				final Dimension newSize;
				if (wider)
					if (taller)
						if (widerThanTaller)
							newSize = heightChange;
						else
							newSize = widthChange;
					else
						newSize = heightChange;
				else
					if (taller)
						newSize = widthChange;
					else
						if (widerThanTaller)
							newSize = widthChange;
						else
							newSize = heightChange;
				if (!size.equals(newSize)) {
					setSize(newSize);
					oldSize = getSize();
				}
			}
			
			@Override
			public void componentMoved(ComponentEvent e) {}
			
			@Override
			public void componentHidden(ComponentEvent e) {}
		});
		final int startFactor = 10;
		setSize(width * startFactor, height * startFactor);
		oldSize = getSize();
		setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	
	public static void main(String[] args) {
		new ResizeJFrame(16, 9).setVisible(true);
	}
}
Dieses Fenster kann nur Größen im Verhältnis 16:9 annehmen. Die Größe wird aber immer erst dann justiert, wenn die Maustaste losgelassen wurde. Gibt es eine Möglichkeit, dass dies "just in time" passiert, also während der Rahmen noch gezogen wird?
 
Zuletzt bearbeitet:
G

Gast2

Gast
Mit nem Listener wirst du da nicht weit kommen, ich wüsste jetzt kein Event das ausgeführt wird solang der Rahmen noch gezogen wird.
Du kannst aber JFrame erweitern und dich in irgend eine Methode einklinken, z.b. in die layout oder paint Methode. Wenn du die Überschreibst (den super aufruf nicht vergessen) kannst du deinen code ausführen. Da musst du allerdings aufpassen wo du da rumwerkelst und wann, da musst du einfach mal nen bissl rumprobieren bis sich das so verhält wie du willst.
 

xehpuk

Top Contributor
Danke schon mal für den Input.

Bevor ich mich in diese Strukturen wage, würde ichs gern noch auf andere Weise versuchen. Ich bin nun auf die Idee gekommen, den ComponentListener nicht direkt am JFrame, sondern an dessen JRootPane zu registrieren, da dieser ja immer "losschießt", wenn sich die Größe des JRootPanes ändert, also auch, während das JFrame noch resized wird.
[JAVA=15] getRootPane().addComponentListener(new ComponentListener() {[/code]
Leider "flackert" es, während ich die Größe ändere. Ziehe ich den JFrame in die Breite, wird währenddessen zwischen korrekter Anpassung der Höhe und alter Höhe gewechselt. Dasselbe dann umgekehrt, wenn ich ihn in die Länge ziehe. Bewege ich die Maus dann nicht, wirds korrekt angezeigt. Lasse ich dann los, wird jedoch wieder auf die alte Größe gesetzt.

Ich denke schon, dass ich der Lösung näher gekommen bin, nur irgendetwas noch übersehe. Woran hakt es da noch, woher das Hin- und Herwechseln der Größe?
 

Denny1989

Aktives Mitglied
meinst du es ist gesund in einem Listener auf eine Eigenschaft eben diese zu ändern? Wie ich das verstanden habe willst du "just in time" das Format anpassen richtig? Das konnte das Flackern erklären da er die ganze Schose evtl ein paar hundert mal die Sekunde macht !?

Ist aber eher ein Tip denn hundert prozentige Sicherheit.
 

xehpuk

Top Contributor
Ich weiß nicht, wie gesund das ist. In diesem Fall scheints nicht so gesund zu sein, wobei ich den Fehler noch nicht entdeckt habe. Ein Abbruchkriterium habe ich ja, daher sollte das eigentlich kein Problem sein.
Eventuell ein Threading/Sichtbarkeitsproblem? ???:L

Nun ja, ich arbeite nun erst mal daran, dass der Content ordentlich gelayoutet wird, während der Rahmen gezogen wird.
 

xehpuk

Top Contributor
Kleines Update dazu:

Seit Java 7 funktioniert die ursprüngliche Methode auch nicht mehr. Hier der aktuelle Code:
Java:
import java.awt.Dimension;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import static java.lang.Math.round;
import javax.swing.JFrame;
import javax.swing.SwingUtilities;

public class RatioJFrame extends JFrame {
	private final float ratio;
	private Dimension oldSize;
	
	public RatioJFrame(final int width, final int height) {
		this.ratio = width / (float) height;
		addComponentListener(new ComponentAdapter() {
			@Override
			public void componentResized(ComponentEvent e) {
				final Dimension size = getSize();
				setTitle(size.width + ":" + size.height);
				if (size.equals(oldSize))
					return;
				if (getExtendedState() == JFrame.MAXIMIZED_BOTH)
					return;
				final int diffWidth = size.width - oldSize.width;
				final int diffHeight = size.height - oldSize.height;
				final boolean widerThanTaller = round(diffWidth / ratio) > diffHeight;
				final boolean wider = diffWidth > 0;
				final boolean taller = diffHeight > 0;
				final int widthToHeight = round(size.width / ratio);
				final int heightToWidth = round(size.height * ratio);
				final Dimension heightChange = new Dimension(size.width, widthToHeight);
				final Dimension widthChange = new Dimension(heightToWidth, size.height);
				final Dimension newSize;
				if (wider)
					if (taller)
						if (widerThanTaller)
							newSize = heightChange;
						else
							newSize = widthChange;
					else
						newSize = heightChange;
				else
					if (taller)
						newSize = widthChange;
					else
						if (widerThanTaller)
							newSize = widthChange;
						else
							newSize = heightChange;
				if (!size.equals(newSize))
					setSize(newSize);
			}
		});
		setSize(new Dimension(width, height));
		setLocationRelativeTo(null);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	
	@Override
	public void setSize(final int width, final int height) {
		oldSize = new Dimension(width, height);
		super.setSize(width, height);
	}
	
	public static void main(final String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			@Override
			public void run() {
				new RatioJFrame(300, 200).setVisible(true);
			}
		});
	}
}
Dies reagiert nun so wie der zweite Versuch mit JRootPane, sprich: Ist unbenutzbar.

Ich habe dazu vor über zwei Wochen einen Bugreport bei Oracle eingereicht: Bug Database
Ist bis heute nicht einsehbar, daher ist wohl davon auszugehen, dass dieses neue Verhalten gewünscht ist.
Mit
Code:
invokeLater()
innerhalb der
Code:
componentResized()
habe ich auch erfolglos herumgespielt.
Außerdem habe ich es mit einem eigenen LayoutManager und mit Überschreiben von
Code:
layout()
probiert.

Nichts hat geholfen. Hat noch jemand Ideen dazu? Das sollte doch eigentlich machbar sein, ohne seine eigene Fensterklasse schreiben zu müssen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Java FX Scrollpane automatisch resizen AWT, Swing, JavaFX & SWT 3
Tom299 JavaFX AnchorPane resizen, aber wie? AWT, Swing, JavaFX & SWT 3
R TriangleMesh verschwindet teilweise beim resizen des Frames, sowie beim rotieren? AWT, Swing, JavaFX & SWT 1
M Bild aus JLabel resizen und speichern AWT, Swing, JavaFX & SWT 0
D JTable Columns wollen einfach nicht resizen AWT, Swing, JavaFX & SWT 5
R Swing Per Maus JLabel resizen AWT, Swing, JavaFX & SWT 6
C SWT-Elemente an View-Fenster angleichen und automatisch resizen AWT, Swing, JavaFX & SWT 3
D Undecorated JFrame ohne Flackern resizen AWT, Swing, JavaFX & SWT 21
H Swing JWindow flackert beim resizen AWT, Swing, JavaFX & SWT 6
A SWT Bilder resizen AWT, Swing, JavaFX & SWT 9
T JFrame resizen AWT, Swing, JavaFX & SWT 4
S Tabelle soll sich auch in der Höhe resizen? AWT, Swing, JavaFX & SWT 4
S Seitenverhältnis behalten beim Fenster resizen AWT, Swing, JavaFX & SWT 2
V Nulllayout und wie auf Resizen reagieren? AWT, Swing, JavaFX & SWT 4
T Probleme beim Resizen einer JScrollPane AWT, Swing, JavaFX & SWT 2
S SWT nur gleichzeites Resizen AWT, Swing, JavaFX & SWT 3
N JSplitPane soll JFrame resizen AWT, Swing, JavaFX & SWT 4
G Flimmern beim Resizen AWT, Swing, JavaFX & SWT 2
M effizient mehrere BufferedImage in eines schreiben AWT, Swing, JavaFX & SWT 6
O Swing Icon verschwindet beim Verschieben eines JLabels AWT, Swing, JavaFX & SWT 8
jojoge wie kann ich in eine Benennung eines JButtons eine Variable einbauen? AWT, Swing, JavaFX & SWT 6
L paintComponent in Panel eines Borderlayouts hinzufügen AWT, Swing, JavaFX & SWT 3
I Einbindung eines jpg/png/icons in eine GUI AWT, Swing, JavaFX & SWT 1
Splayfer Umrandung eines AttributedStrings AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
Jose05 NullPointerException bei Beschreiben eines Labels aus einem Array AWT, Swing, JavaFX & SWT 12
Jose05 zugreifen auf ein Objekt eines GridPanes AWT, Swing, JavaFX & SWT 0
melaniemueller Verschiebung eines Fensters über Button AWT, Swing, JavaFX & SWT 27
news2swen automatisches erstellen eines Languagefiles AWT, Swing, JavaFX & SWT 1
B Stylen eines JTextPane funktioniert nicht AWT, Swing, JavaFX & SWT 1
MiMa Schliessen eines FXML Fensters? AWT, Swing, JavaFX & SWT 10
B JavaFX Farbe eines Quadrates in einer separaten Klasse ändern AWT, Swing, JavaFX & SWT 4
L AWT Ändern der Farbe eines BufferedImage mit Farbähnlichkeit AWT, Swing, JavaFX & SWT 5
B veränderte Größe eines Panels im Vorhinein wissen? AWT, Swing, JavaFX & SWT 1
L Komponenten eines Panels werden erst nach Klick darauf angezeigt AWT, Swing, JavaFX & SWT 13
L JavaFX Validierung eines Spinner AWT, Swing, JavaFX & SWT 1
M Builden eines lauffähigen JAR Files AWT, Swing, JavaFX & SWT 3
K Swing Text eines Lables in einer Methode ändern AWT, Swing, JavaFX & SWT 13
M JavaFX rotieren eines Kreises mit konstanter Geschwindigkeit AWT, Swing, JavaFX & SWT 1
K JavaFX Allgemeine Fragen zu dem Aufbau eines Programms hinsichtlich der Klassen AWT, Swing, JavaFX & SWT 1
M JavaFX Auf ein UI Elemement eines anderen Controllers zugreifen AWT, Swing, JavaFX & SWT 0
P Bewegung eines Balkens in eineum JPanel welches als Spielfeld fungiert AWT, Swing, JavaFX & SWT 2
Tronert JavaFX Linienstärke eines Separators ändern? AWT, Swing, JavaFX & SWT 3
N JavaFX Group: Gezieltes entfernen eines Objects (Rectangle) AWT, Swing, JavaFX & SWT 0
J Ziehen eines Buttons im JPanel AWT, Swing, JavaFX & SWT 2
J Drag and Drop eines Buttons AWT, Swing, JavaFX & SWT 0
M NullPointerException bei Übergabe eines RadioButtons AWT, Swing, JavaFX & SWT 11
DaCrazyJavaExpert Swing Extern den Text eines nicht fetsgelegten Buttons bekommen. AWT, Swing, JavaFX & SWT 12
J JavaFX Rectangle innerhalb eines Rectangle oder Panes positionieren? AWT, Swing, JavaFX & SWT 1
C JavaFX Inhalt eines SplitPane's durch Menü-Auswahl ändern? AWT, Swing, JavaFX & SWT 13
J linken Bildausschnitt eines BufferedImage abschneiden AWT, Swing, JavaFX & SWT 4
J bestimmten Bereich eines JPanels drucken AWT, Swing, JavaFX & SWT 2
D LookAndFeel Überschreiben eines UIDelegate AWT, Swing, JavaFX & SWT 0
T Java FX Probleme beim befüllen eines Tableviews AWT, Swing, JavaFX & SWT 5
C Zeichen eines 6 -Eckes AWT, Swing, JavaFX & SWT 1
U JavaFX Wechsel der Scene nach betätigen eines Button AWT, Swing, JavaFX & SWT 2
F Screenshot eines JPanel AWT, Swing, JavaFX & SWT 3
S JavaFX TreeItem: Icon am Ende eines Eintrags anhängen AWT, Swing, JavaFX & SWT 2
D TAB Taste innerhalb eines JSpinner AWT, Swing, JavaFX & SWT 2
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
F Swing Spaltenbreite einer Column eines JTable auslesen AWT, Swing, JavaFX & SWT 5
D Swing Komponenten Anordnung eines Panels in Verbindung eines weiteren Panels AWT, Swing, JavaFX & SWT 9
F Swing Rotation eines Bildes mit beliebigen Koordinaten um den Mittelpunkt AWT, Swing, JavaFX & SWT 3
Cromewell JavaFX Nur bestimmten Teil eines Canvas rendern und anzeigen AWT, Swing, JavaFX & SWT 2
Z Swing Variable eines Objekt aus Hashmap in JList anzeigen AWT, Swing, JavaFX & SWT 1
D Frame beim starten eines anderen Frames schließen AWT, Swing, JavaFX & SWT 2
R Hilfe beim ändern des Hintergrundes eines JFrames AWT, Swing, JavaFX & SWT 9
T Durch klicken eines Buttons Klasse wechseln AWT, Swing, JavaFX & SWT 2
E Swing Copy und Paste eines einzelnen Knoten aus einem JTree AWT, Swing, JavaFX & SWT 1
J Swing Vertikales Zeichnen eines Strings mit Java2D AWT, Swing, JavaFX & SWT 1
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
V JavaFX Teile eines Images Transparent machen AWT, Swing, JavaFX & SWT 4
I JavaFX Langes drücken eines Buttons AWT, Swing, JavaFX & SWT 4
B Swing Wie Witdh und Height eines GuiElements bekommen AWT, Swing, JavaFX & SWT 5
L Swing Teile eines JPanel in eigene Klasse auslagern AWT, Swing, JavaFX & SWT 3
M Swing JPanel innerhalb eines Frames verschieben AWT, Swing, JavaFX & SWT 3
J JavaFX Zugriff auf FXML-Variablen eines anderen Controllers AWT, Swing, JavaFX & SWT 2
K Swing Inhalt eines JPanels lesen AWT, Swing, JavaFX & SWT 3
T Nur bestimmte Bereiche eines Fotos bearbeiten AWT, Swing, JavaFX & SWT 0
J Swing Erstellung eines User Interface AWT, Swing, JavaFX & SWT 2
S JavaFX Teil eines Bildes ausschneiden / als neues Bild nutzen AWT, Swing, JavaFX & SWT 8
R Swing Bewegung eines Graphics Objektes innerhalb eines JPanels funktioniert nicht richtig AWT, Swing, JavaFX & SWT 2
O Swing Aufbau eines JFrames AWT, Swing, JavaFX & SWT 2
A JavaFX Hilfe beim Design eines Quiz AWT, Swing, JavaFX & SWT 2
F Instanzierung einer inneren Klasse in Klasse eines anderen Packets AWT, Swing, JavaFX & SWT 3
A befüllen eines JTables mittels Methode AWT, Swing, JavaFX & SWT 10
javampir Swing Wanderung eines JFrames AWT, Swing, JavaFX & SWT 7
J Anfänger GUI Problem bei der Ausführung eines sehr einfachen Programms AWT, Swing, JavaFX & SWT 2
G Swing ComboBox: Auswahl eines Items der Liste durch Eingabe eines Buchstabens AWT, Swing, JavaFX & SWT 3
S Swing Nur den sichtbaren Bereich eines TextPane mit Inhalt darstellem AWT, Swing, JavaFX & SWT 0
I Erstellung eines kleinen Programmes AWT, Swing, JavaFX & SWT 8
H Position eines JLabel in einem JPanel AWT, Swing, JavaFX & SWT 2
J 2D-Grafik Windows Blue-Screen nach anzeigen eines Bildes in Java AWT, Swing, JavaFX & SWT 10
T Swing Einzelne Teile eines Textes färben? AWT, Swing, JavaFX & SWT 10
H Swing Probleme beim erstellen eines neuen Objektes durch einen Button AWT, Swing, JavaFX & SWT 10
HaukeG JavaFX JavaFX Resize und DragAndDrop eines Pane AWT, Swing, JavaFX & SWT 4
D 2D-Grafik Inhalt eines Graphics in anderes Graphics zeichnen.... AWT, Swing, JavaFX & SWT 3
J Denkfehler bei Aktualisierung eines GUI AWT, Swing, JavaFX & SWT 4
J Logikfehler im erstellen eines GUI AWT, Swing, JavaFX & SWT 3
F JTabbedPane mit Button zum Hinzufügen eines neuen Tabs AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen


Oben