2009-05-02 8 views
6

Ich bin auf der Suche nach einem Ort, an dem Code angehängt wird, um programmgesteuert JPanel nach dem Laden der Anwendung zu erstellen, zu skalieren und zu positionieren.Welches Java Swing-Ereignis kann verwendet werden, um zu wissen, wann die Anwendung beendet wurde?

Ich fange gerade mit Java an. Ich benutze NetBeans 6.5.1 mit jdk1.6.0_13. Ich habe den neuen Projekt-Assistenten verwendet, um eine grundlegende Java/Swing-Desktop-Anwendung zu erstellen. Dies ist eine SingleFrameApplication, die ein FrameView mit einem zentralen Haupt-JPanel verwendet, in dem alle UI-Elemente platziert sind.

Ich habe zuerst meinen Code im FrameView-Konstruktor versucht, aber wenn ich versuche, mein JPanel basierend auf dem Begrenzungsrechteck einer der Entwurfszeitsteuerelemente, die ich der Benutzeroberfläche hinzugefügt habe, anzuordnen, ist das Steuerelement noch nicht fertig positioniert und so dimensioniert Ich bekomme nur Nullen für die Koordinaten.

Ich habe überprüft, dass mein Code wie erwartet funktioniert, indem ich ihn von einem Klick-Ereignis aus aufrufen, nachdem die Anwendung geladen wurde. Mein Problem besteht darin, einen Weg zu finden, wann alles fertig ist.

Ich habe auch versucht, das ComponentShown-Ereignis aus dem Haupt-JPanel, aber ich später gelesen, dass nur ausgelöst wird, wenn setVisible explizit aufgerufen wird, die anscheinend nicht während des normalen Anwendungsstart erfolgt.

Kann jemand einige Hinweise zur Verfügung stellen? Vielen Dank.

Update:

Zusätzlich zu dem, was ich unten in meiner Antwort erwähnt, habe ich auch über die Application.ready() -Methode lesen. Dies wäre auch ein Zeitpunkt von Interesse, um zu wissen, wann der UI-Teil einer Anwendung fertig ist, alles zu tun, was zu tun ist. Die Kommunikation mit meiner Ansicht aus der Anwendung schien jedoch ein wenig chaotisch.

Antwort

4

Die Lösung, mit der ich ging, war eigentlich eine Kombination aus den Antworten von Charles Marin und JRL (Ich habe Ihre beiden Antworten für Kredit aufgestuft, danke).

Ich hatte meine FrameView-Klasse WindowListener implementieren.

... 
public class MyView extends FrameView implements WindowListener 
... 

und in meinem FrameView-Konstruktor habe ich einen Listener zum Hauptframe der Anwendung hinzugefügt.

... 
getFrame().addWindowListener((WindowListener) this); 
... 

Dann in meiner Implementierung von windowActivated konnte ich den Code nenne ich eine Kontrolle über die wichtigsten JPanel auf die Lage und Größe anderer Steuerelemente auf Basis anordnen und Größe musste.

public void windowActivated(WindowEvent e) 
{ 
    // The application should now be finished doing its startup stuff. 
    // Position and size a control based on other UI controls here 
} 
+0

+1 für detaillierte Antwort – Freak

3

I denken Sie Sie wollen WindowActivated. Schauen Sie sich this part of the tutorial an.

+0

windowActivated scheint eine Methode eines Rahmens oder Dialogs zu sein. Ich habe Zugriff auf eine SingleFrameApplication, eine FrameView und das Haupt-JPanel. Keines davon ist ein Rahmen oder ein Dialog. –

+0

+1: Ich konnte schließlich herausfinden, wie man auf das windowActivated-Ereignis kommt. Vielen Dank. –

1

Ich würde versuchen, getFrame().isValid()

+0

Das hört sich gut an, aber wenn ich wüsste woher es kommen soll, um es wieder wahr zu bekommen, würde ich wissen, wo ich meinen Code einfügen soll. –

+0

Sie könnten eine separate Aufgabe haben, die die Methode ausführt, bis sie wahr zurückgibt Größenänderung. Sie können die Aufgabe innerhalb Ihres FrameView-Konstruktors starten. – JRL

+0

+1: getFame() war der Schlüssel, um an den JFrame zu gelangen, den ich brauchte, um sich in das windowActivated-Ereignis einzuloggen, danke. –

1

mit Ich nehme an, das der Editor Sache WYSIWYG ist. Ich schaue NetBeans 6.1 an, damit Ihre Erfahrungen variieren können.

Die traditionelle Art, Swing-Komponenten zu gestalten, ist die Verwendung eines LayoutManager (oder LayoutManager2). Gemäß der NetBeans-Hilfe unterstützt der visuelle Editor diese, solange sie keine Unterstützung für Einschränkungen benötigen.

Das Verfahren geht in etwa so:

  1. Erstellen Sie ein neues Java Bean und haben es implementieren Layoutmanager (a BeanInfo erforderlich ist, auch für Paletten Unterstützung - Sie ein durch Rechtsklick auf die Bean-Klasse erstellen können)
  2. Erstellen Sie das Projekt
  3. Rechtsklick auf die Bohne und wählen Werkzeuge > zu Palette hinzufügen ... und fügen Sie es
  4. Rechtsklick auf das Panel, für die Sie das Layout und die selec festlegen möchten t Set-Layout > Ihr Bean Name

Sie können feststellen, die Entwurfszeit-Erfahrung etwas fehlt.

Eine Probe Layout Implementierung:

public class StepLayoutBean extends Object implements Serializable, LayoutManager { 

    public void addLayoutComponent(String name, Component component) { 
    } 

    public void layoutContainer(Container container) { 
     Dimension space = container.getSize(); 
     int xoffset = 0; 
     int yoffset = 0; 
     for (Component kid : container.getComponents()) { 
      Dimension prefSize = kid.getPreferredSize(); 
      if (prefSize.width + xoffset > space.width) { 
       xoffset = 0; 
      } 
      Rectangle bounds = new Rectangle(xoffset, yoffset, prefSize.width, prefSize.height); 
      kid.setBounds(bounds); 
      xoffset += prefSize.width; 
      yoffset += prefSize.height; 
     } 
    } 

    public Dimension minimumLayoutSize(Container container) { 
     Dimension size = new Dimension(); 
     for (Component kid : container.getComponents()) { 
      Dimension minSize = kid.getMinimumSize(); 
      size.width = minSize.width > size.width ? minSize.width : size.width; 
      size.height += minSize.height; 
     } 
     return size; 
    } 

    public Dimension preferredLayoutSize(Container container) { 
     Dimension size = new Dimension(); 
     for (Component kid : container.getComponents()) { 
      Dimension prefSize = kid.getPreferredSize(); 
      size.width += prefSize.width; 
      size.height += prefSize.height; 
     } 
     return size; 
    } 

    public void removeLayoutComponent(Component component) { 
    } 
} 

Wenn ein benutzerdefiniertes Layout nicht die Rechnung passt, haben einen Blick auf die Ereignisbindungen unter dem Fenster Eigenschaften der Komponente - obwohl auf diese Weise Größenänderung könnte für einige ein Rezept sein Art von rekursivem Ereignissturm.

+0

+1: Ich bin mir sicher am Ende, das ist der Weg zu gehen. Ich war auch sehr daran interessiert, den Lebenszyklus des Anwendungsrahmens zu verstehen. Vielen Dank. –

Verwandte Themen