Java Swing pack () sur une fenêtre le décompose, comment éviter cela?


J'ai une fenêtre et comme je change dinamiquement ses enfants (parfois j'échange des JPanels), je n'ai trouvé aucune autre solution que d'appeler pack() sur la fenêtre pour afficher le nouvel élément. Sinon, il n'apparaîtra que si je redimensionne manuellement la fenêtre.

Le problème avec ceci est que si la fenêtre est maximisée, après pack() elle ne le sera plus, ce qui n'est pas ce que je pourrais donner au client.

Des indices?

Author: mKorbel, 2011-08-29

4 answers

Tout d'abord, j'espère que vous utilisez CardLayout pour l'échange de panneau, puisque cette fonctionnalité est intégrée dans ce gestionnaire de mise en page particulier. Et généralement, vous aurez envie de les invoquer validate/revalidate et repaint sur le conteneur pour actualiser l'affichage.

Voir aussi:

 5
Author: mre, 2011-08-29 15:28:35

Si vous devez vraiment:

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

... Sinon, la solution de @mre est (beaucoup) meilleure! :)

 4
Author: dacwe, 2011-08-29 15:29:19

J'ai le même problème que vous et pour moi je suis satisfait de ma solution que je partage il se peut que cela vous aide sur votre contexte

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

}

J'ai conçu un panneau vide sur mon cadre principal et dans un bouton j'appelle ceci

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

Cela fonctionne parfaitement pour moi

 0
Author: Mohammed Housseyn Taleb, 2016-11-12 14:40:38

Que ma nouvelle façon de gérer ce problème:

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

J'utilise cette méthode pour masquer et afficher les jpanels sur mon jframe.

Exemple sur un code de bouton

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

La même chose pour la cachette.

 0
Author: Mohammed Housseyn Taleb, 2017-02-28 23:19:55