Fenster in festem Seitenverhältnis vergrößern

Klein0r

Erfahrenes Mitglied
Hallo zusammen,

hat jemand eine Idee wie man realisieren könnte, dass sich ein JFrame nur in einem festen Seitenverhältnis vergrößern lässt?
Also Wenn ich die Höhe des Fensters verändere, soll sich die Breite im Verhältnis anpassen (und umgekehrt).

Allerdings möchte ich ein setzen mit setSize nach der Veränderung der Größe vermeiden.

lg
 
Sers!

Mein Ansatz wäre wohl ein ComponentListener zu implementieren und in deren Methode : componentResized auf Größenveränderungen zu reagieren.

Bsp.:
Code:
	public void componentResized(ComponentEvent e) {
		int height =((JFrame)e.getSource()).getHeight();
		((JFrame)e.getSource()).setSize(height*2, height);		
	}

Das Problem bei diesem Code ist, dass du nur auf Veränderung der Höhe ODER der Breite reagieren kannst. Du könntest natürlich die Höhe und die Breite beim Aufruf der Klasse in Variablen speichern. Aber auch bei dieser Variante musst du dich bei Änderung der Größe entscheiden, ob du nun die Höhe an die Breite angleichen willst oder die Breite an die Höhe.

Wie du das nun ohne setSize-Methode machen willst, ist mir jedoch ein Schleiher. Auch fällt mir kein Grund dafür ein! Trotzdem weiterhin viel Glück... vielleicht findest du ja einen eleganteren Weg.. dann lass es uns wissen!
 
Hi und danke für die Antwort ;)

Naja wie du schon schreibst - wie mit dem ComponentListener ist das Problem, dass ich erneut die Breite anpassen muss und sich so erneu die Größe ändert und der Listener wieder reagiert - also quasi ne Schleife bis sich das Seitenverhältnis "eingependelt" hat. Das will ich direkt vermeiden indem ich die andere Seite des Fensters direkt mit im Verhältnis vergrößer.

Also müsste es eine "componentResizing" statt Resized geben ;)
Verstehst du mein Problem?

Das ist für mich in sofern wichtig, dass von der Fenstergröße abhängig diverse Bilder neu berechnet werden - und das dauert 1-2 Sekunden und sollte von daher nicht unbedingt mehrfach hintereinander geschehen...

lg
 
Sers!

Ich will doch mal hoffen, dass ich dich richtig verstanden hab. Ansonsten gibts das hier gratis! ;) äähh... umsonst mein ich.:p

Also meine Idee ist folgende:

Man setzt irgendein Icon unten rechts in die Ecke als Dragpoint. So wie es in anderen Programmen auch der Fall ist.
Wenn man die Fenstergröße nun ändern möchte, drückt man auf das Icon und zieht es an die geüwnschte Stelle. Dieses Icon hat einen MouseMotionListener, d.h. bei jeder Änderung der Position der Maus wird diese Stelle berechnet und das Fenster wird im gewünschten Seitenverhältnis angeglichen.

PHP:
package de.javaristen;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MyJFrame extends JFrame implements MouseMotionListener {

    MyJFrame() {

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setSize(500, 250);
        setLayout(new BorderLayout());
        add(getPanel(), BorderLayout.SOUTH);
        setVisible(true);

    }

    private JPanel getPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        // dieses Bild dient als DragPoint.
        Icon icon = new ImageIcon(getClass().getResource("stock_stop.png"));
        JLabel label = new JLabel(icon);
        label.setPreferredSize(new Dimension(15, 15));
        label.addMouseMotionListener(this);
        panel.setSize(30, 30);
        panel.add(label, BorderLayout.EAST);

        return panel;
    }

    public static void main(String[] args) {
        new MyJFrame();
    }

    public void mouseDragged(MouseEvent e) {

        // der Punkt an dem sich der Mauszeiger gerade befindet.
        int x = e.getXOnScreen();
        int y = e.getYOnScreen();
        // bleibt ein Seitenverhältnis von 1:2 gewährleistet.
        // kann den eigen Bedürfnissen angeglichen werden.
        y = x / 2;

        this.setSize(x, y);

    }

    public void mouseMoved(MouseEvent e) {
        // TODO Auto-generated method stub

    }

}


Wenns das auch noch nicht ist... vielleicht einfach mal "idiotensicher" erklären. :suspekt:
 
Also ich habs noch nicht getestet - aber sieht seeehr gut aus!
Auf so eine Idee bin ich ja noch garnicht gekommen ;)

Danke - ich werds testen und Bericht erstatten!

lg
 
Zurück