2011-08-29 6 views
6

Ho una finestra e dato che cambio dinamicamente i miei figli (a volte scambio JPanels), non ho trovato altra soluzione che chiamare pack() sulla finestra per visualizzare il nuovo elemento. Altrimenti verrà visualizzato solo se ridimensiono manualmente la finestra.Java Swing pack() su una finestra non lo massimizza, come evitarlo?

Il problema con questo è che se la finestra è ingrandita, dopo pack() non sarà più, il che non è ciò che potrei dare al client.

Eventuali indizi?

+0

Ridimensiona fotogramma dopo l'esecuzione di pack(), solo un pensiero! Per ridimensionamento intendo programmaticamente – doNotCheckMyBlog

risposta

5

Prima di tutto, spero che tu stia usando CardLayout per lo scambio di pannelli, poiché questa funzionalità è incorporata in quel particolare gestore di layout. In genere, ti consigliamo di invocare validate/revalidate e repaint nel contenitore per aggiornare il display.

Consulta anche:

+0

No, stavo usando borderLayout, non sono uno specialista di swing, mi è stato assegnato questo progetto e Dio solo sa quanto lo odio. Grazie: D – gotch4

+1

È possibile aggiungere pannelli dinamicamente al layout delle carte? – gotch4

+0

@ gotch4, vorrei dire di sì, ma non l'ho ancora provato. – mre

4

Se davvero necessario:

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

... Altrimenti @ La soluzione di MRE è (molto) meglio! :)

0

ho avuto lo stesso problema come te e per me I m soddisfatto della mia soluzione condivido può essere aiuti voi sul vostro contesto

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

}

ho progettato un pannello vuoto sul mio telaio principale e in un pulsante io chiamo questo

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

che funziona perfettamente per me

+0

Uso lo stesso colore di sfondo per il mio pannello vuoto e il mio pannello inserito –

0

che il mio nuovo modo di gestire questo 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 utilizzando questi metodi per nascondere e mostrare jpanels sul mio JFrame.

campione su un codice del pulsante

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

lo stesso per il nascondiglio.