2009-05-02 18 views
6

Estoy buscando un lugar para enganchar un código para crear, dimensionar y ubicar un JPanel mediante programación después de que la aplicación haya terminado de cargarse.¿Qué evento Java Swing se puede usar para saber cuándo la aplicación ha terminado de comenzar?

estoy empezando con Java. Estoy usando NetBeans 6.5.1 con jdk1.6.0_13. He usado el nuevo asistente de proyecto para crear una aplicación básica de escritorio Java/Swing. Esta es una Aplicación SingleFrame que utiliza un FrameView con un JPanel principal central donde se colocan todos los elementos de UI.

Primero probé mi código en el constructor FrameView pero cuando trato de organizar mi JPanel basado en el rectángulo delimitador de uno de los controles de tiempo de diseño que agregué a la UI, ese control aún no se ha terminado de posicionar y dimensionar Estoy obteniendo todos los ceros para las coordenadas.

He verificado mi código funciona como se espera, llamando desde un evento de clic después de la aplicación se haya cargado por lo que mi problema es encontrar una manera de saber cuando todo está terminado siendo dimensionados y dispuestos.

También probé el evento componentShown desde el JPanel principal pero luego leí que solo se activa si se llama explícitamente a setVisible, lo que aparentemente no ocurre durante el inicio normal de la aplicación.

¿Puede cualquier persona proporcionar algunos consejos? Gracias.

Actualización:

Además de lo que he dicho en mi respuesta a continuación, también leí sobre el método Application.ready(). Este también sería un momento de interés para saber cuándo la parte de la interfaz de usuario de una aplicación ha terminado de hacer todo lo que necesita hacer. Comunicarse a mi vista desde la aplicación parecía un poco desordenado sin embargo.

Respuesta

4

La solución con la que fui fue en realidad una combinación de las respuestas de Charles Marin y JRL (subí ambas respuestas por crédito, gracias).

Tuve mi clase FrameView implementar WindowListener.

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

y en mi constructor FrameView agregué un detector al marco principal de la aplicación.

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

Luego, en mi aplicación de windowActivated que podría llamar el código que tenía que organizar y tamaño de un control sobre los principales JPanel en función de la ubicación y el tamaño de otros controles.

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 para una respuesta detallada – Freak

3

I piensa que quiere que WindowActivated. Eche un vistazo al this part of the tutorial.

+0

windowActivated parece ser un método de un cuadro o Diálogo. Tengo acceso a SingleFrameApplication, a FrameView y al principal JPanel. Ninguno de esos son un marco o Diálogo. –

+0

+1: Pude eventualmente encontrar la forma de acceder al evento windowActivated. Gracias. –

1

que iba a tratar utilizando getFrame().isValid()

+0

Eso suena bien, pero si supiera desde dónde llamarlo para que sea verdadero, sabría dónde poner mi código :) –

+0

Podría tener una tarea separada que ejecute el método hasta que se vuelva verdadero, y luego haga su cambio de tamaño. Puede comenzar la tarea desde su constructor FrameView. – JRL

+0

+1: getFame() fue la clave para obtener el JFrame que necesitaba para conectarme al evento activado por la ventana, gracias. –

1

Supongo que esto es lo editor WYSIWYG. Estoy viendo NetBeans 6.1, por lo que sus experiencias pueden variar.

La forma tradicional de diseñar componentes Swing es mediante el uso de LayoutManager (o LayoutManager2). De acuerdo con la ayuda de NetBeans, el editor visual los admite siempre que no requieran soporte para restricciones.

El procedimiento es algo como esto:

  1. Crear un nuevo JavaBean y tienen que poner en práctica LayoutManager (un BeanInfo se requiere también para el apoyo paleta - se puede crear una haciendo clic derecho en la clase de bean)
  2. Generar el proyecto
  3. Haga clic con el frijol y elegir > Herramientas añadir a la paleta ... y añadirlo
  4. Haga clic derecho en el panel para el que desea establecer el diseño y la selec t configurar la presentación de > Nuestro Bean Nombre

Puede encontrar la experiencia en tiempo de diseño un poco deficiente.

Una implementación disposición de la muestra:

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) { 
    } 
} 

Si un diseño personalizado no encaja en el proyecto de ley, echar un vistazo a los enlaces de eventos bajo el panel de propiedades del componente - a pesar de cambiar el tamaño de esa manera podría ser una receta para algunos tipo de tormenta de eventos recursivos.

+0

+1: estoy seguro que al final, este es el camino a seguir. Estaba realmente interesado en comprender el ciclo de vida del marco de aplicación también. Gracias. –

Cuestiones relacionadas