2011-08-29 22 views
6

Tengo una ventana y dado que cambio dinamicamente sus hijos (a veces cambio JPanels), no encontré otra solución que llamar a pack() en la ventana para mostrar el nuevo elemento. De lo contrario, aparecerá solo si cambio el tamaño manualmente de la ventana.Java Swing pack() en una ventana no maximiza, ¿cómo evitar eso?

El problema con esto es que si la ventana está maximizada, después de pack() ya no estará, lo cual no es lo que podría darle al cliente.

Alguna pista?

+0

Redimensionar el marco después de ejecutar el paquete(), ¡solo una idea! Por tamaño, quiero decir, programáticamente – doNotCheckMyBlog

Respuesta

5

Antes que nada, espero que esté usando CardLayout para el intercambio de paneles, ya que esta funcionalidad está integrada en ese administrador de diseño en particular. Y, por lo general, querrá invocar validate/revalidate y repaint en el contenedor para actualizar la pantalla.

Consulte también:

+0

No, yo estaba usando borderLayout, no soy especialista en swing, me han asignado este proyecto y Dios sabe cuánto lo odio. Gracias: D – gotch4

+1

¿Es posible agregar paneles dinámicamente al diseño de la tarjeta? – gotch4

+0

@ gotch4, me gustaría decir que sí, pero aún no lo he probado. – mre

4

Si realmente tiene que:

int state = frame.getExtendedState(); 
frame.pack(); 
frame.setExtendedState(JFrame.MAXIMIZED_BOTH); 

... De lo contrario @ solución de ERM es (mucho) mejor! :)

0

que tiene el mismo problema que usted y para mí I m satisfecho con mi solución Comparto puede ser que le ayude en su contexto

import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.GridBagConstraints; 
import java.awt.GridBagLayout; 
import java.awt.Insets; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

/** 
* 
* @author Housseyn 
*/ 
public class JPanelTools { 

public static final void ShowPanel(JPanel target, JPanel object) { 
    target.removeAll(); 

    Dimension size = object.getSize(); 
    size.setSize(size.width, target.getHeight()); 
    target.setSize(object.getSize()); 

    GridBagLayout gridBagLayout = new GridBagLayout(); 

    target.setLayout(gridBagLayout); 

    GridBagConstraints gbc = new GridBagConstraints(target.getX(), 
      target.getY(), 
      target.getWidth(), 
      target.getHeight(), 
      0, 0, 
      GridBagConstraints.ABOVE_BASELINE, 
      0, 
      new Insets(5, 5, 5, 5), 
      0, 0); 

    target.add(object, gbc); 
    target.invalidate(); 
    target.revalidate(); 
    target.validate(); 
    target.repaint(); 
    target.show(); 
    object.validate(); 
    object.repaint(); 
    object.show(); 

    Container Frame = target.getParent(); 
    Container Current = target.getParent(); 
    while ((Current != null)) { 
     System.out.println("current =" + Current.getClass().getName()); 
     Frame = Current; 
     Current = Current.getParent(); 
    } 
    System.out.println("frame " + Frame.getClass().getName()); 
    if (Frame != null) { 
     System.out.println("pack"); 
     JFrame MyFrame = (JFrame) Frame; 
     int extendedState = MyFrame.getExtendedState(); 
     if (extendedState != JFrame.MAXIMIZED_BOTH) { 

      MyFrame.pack(); 
      MyFrame.setExtendedState(extendedState); 
     } 
    } 
} 

}

que diseñó un panel vacío en mi cuadro principal y en un botón que llamo esta

MyDesignedPanel myPanel = new MyDesignedPanel(); 
    JPanelTools.ShowPanel(JemptyPanel, myPanel); 

que funciona perfectamente para mí

+0

Uso el mismo color de fondo para mi panel vacío y mi panel insertado –

0

que mi nueva manera de manejar este problema:

public static void showForms(JFrame frame,JPanel[] jPanels){ 
    for (JPanel jPanel : jPanels) { 
     showForms(frame, jPanel,false); 
    } 
    int extendedState = frame.getExtendedState(); 
    if (extendedState==JFrame.MAXIMIZED_BOTH) { 
     return; 
    } 
    frame.pack(); 
} 

public static void showForms(JFrame frame, JPanel jPanel, boolean doPack) { 
    jPanel.setVisible(true); 
    if (doPack) { 
     int extendedState = frame.getExtendedState(); 
     if (extendedState==JFrame.MAXIMIZED_BOTH) { 
     return; 
    } 
     frame.pack(); 
    } 
} 

public static void hideForms(JFrame frame, JPanel[] jPanel) { 
    for (JPanel panel : jPanel) { 
     hideForms(frame, panel, false); 
    } 
    int extendedState = frame.getExtendedState(); 
    if (extendedState==JFrame.MAXIMIZED_BOTH) { 
     return; 
    } 
    frame.pack(); 
} 

public static void hideForms(JFrame frame, JPanel jPanel, boolean doPack) { 
    jPanel.setVisible(false); 
    if (doPack) { 
     int extendedState = frame.getExtendedState(); 
     if (extendedState==JFrame.MAXIMIZED_BOTH) { 
     return; 
    } 
     frame.pack(); 
    } 
} 

I m utilizando estos métodos para ocultar y mostrar JPanels en mi JFrame.

muestra en un código del botón

JFrameTools.showForms(this,searchPanel,false); 
    JFrameTools.showForms(this,insertingPanel,true); 
    JFrameTools.showForms(this,new jPanel[]{insertingPanel,searchPanel,printingPanel}); 

el mismo para la ocultación.

Cuestiones relacionadas