PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Zentrieren einer Anwendung beim Start



Jor
05-12-2005, 16:57
Hallo *,

zwei Fragen habe ich die mir auf der Seele brennen:
1) Ich möchte eine Anwendung beim Aufruf zentriert auf dem Desktop anzeigen lassen. OS = Windows (XP).
2) Wie kann ich an die Form (Frame) ein Event klöppeln, das Code ausführt, wenn das Frame in der Grösse verändert wird?
Bin JAVA-NewBie, daher würde ich mich freuen, wenn ich Unterstützung bekomme. Im Forum habe ich nichts gefunden.

Danke schonmal!

mwanaheri
05-12-2005, 19:39
Das verwendete Betriebssystem sollte Dir beim Entwickeln für Java so weit als möglich egal sein. Spezifika sind da selten und man sollte sie nicht unnötig benutzen, um plattformunabhängig zu bleiben.

Um die Anwendung zentriert zu starten, musst du erst einmal die Bildschirmauflösung ermitteln:

Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();

Dann ermitteln, wieviel vom Bildschirm eigentlich übrig bleibt, wenn deine Anwendung drauf ist:

int x = dim.getwidth() - Anwendungsbreite;
int y = dim.getheight() - Anwendungshöhe;

beide Werte durch 2 geteilt ergeben dann die linke obere Ecke, in der deine Anwendung anfängt:

x = x / 2;
y = y / 2;

auf die Werte setzt du dann die Ecke:

anwendung.setLocation(x,y);

und machst das Ganze sichtbar:

anwendung.setVisible(true);

Zur zweiten Frage: Was willst du denn da an Code ausführen? Um die Anordnung der Elemente kümmern sich die Layoutmanager.

Jor
05-12-2005, 20:10
Hi mwanaheri,

jep, vielen Dank für deine Antwort! Die erste Frage ist super beantwortet, da komme ich zurecht. Die Angabe des OS habe ich gemacht, da ich dachte, es gäbe Standardfunktionen, die so etwas händeln. Aber selber scripten gefällt mir auch besser.
Zur zweiten Frage: Zum ersten möchte ich in diesem Event abfangen, dass das Frame nur bis auf eine bestimmte Grösse vergrössert bzw. verkleinert werden kann und zum zweiten möchte ich elemente in der Grösse verhältnismässig anpassen. Mit dem Layoutmanager komme ich (noch ;) ) nicht wirklich zurecht. Andersherum habe ich aber auch die Funktion voll in der Hand. Also habe ich irgendwie ein Eventhändler an das Frame zu montieren, aber wie...?

peschmae
05-12-2005, 21:47
Wegen der maximalen/minimalen Grösse gibts eigentlich



public void setMaximumSize(Dimension maximumSize)
public void setMinimumSize(Dimension minimumSize)

(stammen aus java.awt.Component)

Für den Rest - also die Anordnung und das resizen bzw. nicht-resizen solltest du aber *wirklich* einen Layoutmanager verwenden.
Sonst geschiehts recht schnell dass das GUI nur bei dir richtig aussieht und anderswo z.B. nur wegen einer leicht anderen Schriftgrösse, geschweige denn einem anderen OS nicht mehr recht passt.

MfG Peschmä

mwanaheri
05-12-2005, 22:11
Ja, die Layoutmanager können manchmal etwas zicken,
http://madbean.com/anim/totallygridbag
sind aber trotzdem die bessere Wahl. Sie werden handhabbarer, wenn man die Einzeilteile, z.B. eine Gruppe von Buttons, in unterschiedliche Panels packt. Die Panels kann man dann zusammensetzen. Gewöhnlich gehe ich so vor, dass ich eine eigene private Methode arrangeElements() schreibe, die nur für das Arrangement der Oberfläche da ist. Das hält den Konstruktor übersichtlicher.

Am wichtigsten finde ich FlowLayout, GridBag und BorderLayout. Dann kann man das Gesamtfenster im Borderlayout machen, im unteren ("south") Teil ein flowlayout mit Buttons legen und z.B. Textfelder in den mittleren Teil ("center") packen. Spiel dich da am besten einfach etwas rein.

peschmae
06-12-2005, 07:20
Ja, die Layoutmanager können manchmal etwas zicken,

Sicher, aber das ist dann wohl nicht der Fehler vom Prinzip Layoutmanager sondern von der konkreten Implementierung. Oder auch vom Anwender.

Ausserdem wusste ich gar nicht dass Flash auch Layoutmanager benutzt ;-)
(Vielleicht wolltest du auch nicht das sagen - ich hab keinen Flashplayer installiert und hab auch nicht vor einen zu installieren :D)

MfG Peschmä

Jor
06-12-2005, 07:48
Hhmm, also doch erstmal um den Layoutmanager kümmern, bin dann erstmal weg ... lesen ... :rolleyes:
Vielen Dank für die Antworten, und überhaupt für das ganz Forum! Es hilft einem
Neu- bzw. Umsteiger wirklich sehr weiter. Ich habe und nutze natürlich auch Fachbücher, aber eine Diskussion hier kann enorm effektiver undf hilfreicher bei der Lösung eines Problems sein.
Ich habe beim Lesen der Antworten den Eindruck bekommen, das man die Komponenten aus den unterschiedlichen Bereichen AWT, SWT und Swing auch in einer Anwendung mixen kann. Ist das von mir richtig erkannt?

peschmae
06-12-2005, 17:04
Swing und AWT kann man soviel ich weiss recht gut mixen. Aber ich würde eigentlich eher nur Swing benutzen, AWT ist einfach zu beschränkt (funktionalitätsmässig) und passt visuell nicht sehr gut zu Swing-Widgets.

SWT ist eine andere Geschichte, das kann man grundsätzlich erst mal nicht mit den andren beiden mischen.
Es gibt glaub ich so Integrationszeugs aber das würde ich erst mal sein lassen - das wird dann schnell recht kompliziert. Und Sinn macht eine solche Mixtur eh nur in einem Gui-Builder der Swing und SWT unterstützen können muss. Oder so ;)

MfG Peschmä

Lin728
07-12-2005, 16:57
* setMinimumSize/setMaximumSize funktionieren nicht auf java-Frames, leider.
Ich hab diese Funktionen auch mal gebraucht, schlussendlich hab ich dann den Frame-Inhalt nochmal in ein JScrollPane gepackt -> Wirds kleiner als PrefferedSize des Inhalts zeigts halt Scrollbalken an und kein kaputtes Layout.

* Größenänderungen kannst du mit einem ComponentListener überwachen, so viel ich weiß auf alle java.awt.Components, funktioniert auch für Frames/Jframes.

Btw würde auch nur Swing verwenden, speziell wenn du AWT als Basis verwendet (Panel->JButton) hast du kein Dounblebuffering und wenn doch dann für jedes image ein eigenes VolatileImage. Ist nicht so wirklich optimal...