Пакет Java Swing () в окне не максимизирует его, как этого избежать? - PullRequest
6 голосов
/ 29 августа 2011

У меня есть окно, и поскольку я динамически изменяю его дочерние элементы (иногда я меняю JPanels), я не нашел другого решения, кроме вызова pack () в окне, чтобы отобразить новый элемент. В противном случае он будет отображаться только в том случае, если я вручную изменю размер окна.

Проблема в том, что если окно развернуто, то после pack () его больше не будет, что я не могу дать клиенту.

Какие-нибудь подсказки?

Ответы [ 4 ]

5 голосов
/ 29 августа 2011

Прежде всего, я надеюсь, что вы используете CardLayout для замены панели, поскольку эта функциональность встроена в этот конкретный менеджер компоновки. И, как правило, вы захотите вызвать validate / revalidate и repaint на контейнере для обновления отображения.

Смотри также:

4 голосов
/ 29 августа 2011

Если вам действительно нужно:

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

... В противном случае решение @ mre (намного) лучше!:)

0 голосов
/ 01 марта 2017

Это мой новый способ решения этой проблемы:

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

Я использую эти методы, чтобы скрыть и показать jpanels на моем jframe.

пример кода кнопки

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

то же самое для сокрытия.

0 голосов
/ 12 ноября 2016

У меня та же проблема, что и у вас, и я доволен своим решением, которым я поделюсь, возможно, оно поможет вам в вашем контексте

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

}

Я создал пустую панель на моей основной раме и в кнопке я называю это

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

, который идеально подходит для меня

...