Relativpositionierung bei Applets

tuedel

Aktives Mitglied
Hallo schonwieder = ).

Ich habe inzwischen einige Componenten, die nicht mehr im contentPane des Applets liegen. Da sich diese aber relativ zum applet platzieren müssen, sollte es eigentlich möglich sein, Bewegungen des Applets festzustellen. Daher habe ich einen ComponentListener geschrieben, der bei componentMoved ein Event werfen sollte:

Java:
addComponentListener(new ComponentAdapter() {

            @Override
            public void componentMoved(ComponentEvent e) {
                System.out.println("componentMoved");
                reLayoutComponents();
            }

            @Override
            public void componentResized(ComponentEvent e) {
                System.out.println("resized");
            }
        });

Wie es sich aber zeigt, wird der resize zwar festgestellt, jedoch nicht die Bewegung. Die componentMoved methode wird folglich gar nicht gerufen. Hat jemand vielleicht eine Idee, wie ich den relayout durchführen könnte, ohne einen componentListener?

Herzlichen Dank.
 

tuedel

Aktives Mitglied
Falls jemand das Gleiche problem hat, ich habe es folgendermaßen lösen können:

Man benötigt die Frame Instanz des Applets, die man durch folgende Anweisung erhält
Java:
owner = SwingUtilities.windowForComponent(this);
        owner.addComponentListener(new ComponentAdapter() {
            @Override
            public void componentMoved(ComponentEvent e) {
                relocateDialogs();
            }
});

Anschließend kann der listener auf den owner angesetzt werden. Zugleich kann für ein JWindow/JDialog im Konstruktor das korrekte Parent gesetzt werden, sodass die vom Applet erzeugten JDialogs/JWindows immer gemeinsam mit dem Applet sichtbar sind.

Das einzige Problem, mit dem ich mich zZ noch beschäftige, ist die relative Position der Heavyweight container. Es ist mir zwar möglich durch den Listener die Location dieser nachzubessern und dadurch beim draggen durch den User die relativ Positionierung zu erhalten. Jedoch "schleifen" sie ein wenig hinterher, was halt irgendwie ugly ist.

Daher wollte ich fragen, ob jemand eine elegante Möglichkeit kennt, um die Componenten an ihr Parent "festzunageln".


LG
tuedel
 

tuedel

Aktives Mitglied
Hallo!

Ich melde mich, weil das componentMoved/componentResized nicht ganz so funktioniert, wie ich es brauche.

An sich wird das Event getriggered und ich kann die Position korrigieren, allerdings kann man dabei nicht von realtime sprechen. Es scheint, dass das Event erst dann ausgelöst wird, wenn der Frame bereits bewegt worden ist, nicht während er bewegt wird. Beim resize wird das Event sogar erst bei einem MouseReleased gecalled.

Meine Frage ist jetzt, ob es eine Möglichkeit gibt, die MouseListener des Frames/der TitleBar zu erweitern / einen neuen zu registrieren, um realtime auf die Benutzereingaben reagieren zu können?

Ein jFrame.addMouseListener führt nicht zum gewünschten Effekt. Es wird kein Event getriggered.

Herzlichen Dank.
 
S

Spacerat

Gast
Ich weis zwar nicht genau, was du da vor hast, aber ich würd' das nicht im Applet implementieren sondern im Stylesheet (CSS) mit "position: relative". Das sollte auch bei Applets funktionieren.
 

tuedel

Aktives Mitglied
Hm, ich frage mich, wie das funktioniert? Ich werde im CSS das eingebettete Applet relativ zum Browser positionieren können. Allerdings sind ja JDialogs/JWindows usw. eigene container, die ich auch vollkommen unabhängig vom Browser auf dem Screen positionieren kann und im Java initialisere. Wie kann der Browser diese positionieren, wenn er sie nicht einmal kennt ?!

An sich musst du dir die Intension wie bei einem paint Programm wie GIMP vorstellen, wo "Settings Fenster" etc. separiert von der Mainapplikation initialisiert werden. Ich möchte sie aber relativ zum Hauptfenster positionieren und das halt realtime - nicht mit so einer hässlichen Verzögerung.
 
S

Spacerat

Gast
Separate Fenster kann der Browser natürlich nicht positionieren. Für relative Positionen benötigt man ohnehin erst mal einen Bezug. Evtl. funktioniert dazu ja Component.getLocationOnScreen(), aber andererseits könnte das bei Applets restricted sein.
 

tuedel

Aktives Mitglied
GetLocationOnScreen() funktioniert. In der componentMoved des ComponentListener rufe ich

Java:
try {
            settingsParent.setLocation(getLocationOnScreen().x + getWidth() - settings.getWidth(), getLocationOnScreen().y + headerSize + offsetSettings);
            optionsParent.setLocation(getLocationOnScreen().x + getWidth() - options.getWidth(), getLocationOnScreen().y + headerSize + offsetOptions);
            legendParent.setLocation(getLocationOnScreen().x + getWidth() - legend.getWidth(), getLocationOnScreen().y + headerSize + offsetLegend);
        } catch (IllegalComponentStateException e) {
            // window not on screen
        }

Dadurch positionieren die sich wieder relativ zum Applet. Das Problem ist aber, dass das Event irgendwie "zu spät" getriggered wird. Quasi bewege ich den Browser und die Dialoge ziehen mit leichter Verzögerung nach. Quasi wenn das Applet bereits bewegt wurde, wird der Trigger ausgelöst- Das sieht halt ugly aus. Daher würd ich gern über das (irgendwo) bestehende mouseDragged Event der Titlebar arbeiten. Habe aber keine Ahnung wie ich da rankomme..

LG
 

Ähnliche Java Themen

Neue Themen


Oben