Java Swing中的pack()方法会使窗口变为非最大化状态,如何避免这种情况发生?

7
我有一个窗口,因为我动态更改它的子组件(有时我交换JPanels),所以我找不到其他解决方法,只能在窗口上调用pack()来显示新的元素。否则,它只会在我手动调整窗口大小后才会显示出来。
但是,这样做的问题是,如果窗口被最大化了,在pack()之后它将不再是最大化的,这不是我想给客户的结果。
有何解决办法?

执行pack()后调整框架大小,只是一个想法!我指的是通过编程方式调整大小。 - TeaCupApp
4个回答

5

不,我正在使用BorderLayout布局,我不是Swing专家,但我被分配了这个项目,天知道我有多讨厌它。谢谢:D - gotch4
1
能否动态地向卡片布局添加面板? - gotch4
@gotch4,我想说是的,但我还没有测试过。 - mre
你可以将面板添加到CardLayout中,然后使用它们的名称进行“show()”。为什么要动态添加它们?你可以动态地“show()”它们。 - WesternGun

4
如果你真的必须这样做:
int state = frame.getExtendedState();
frame.pack();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);

否则,@mre的解决方案会更好! :)

0

我遇到了和你一样的问题,但是我对我的解决方案感到满意,我分享出来,也许可以帮助你解决你的问题。

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

这对我来说完美地运作。


我在空面板和插入面板中使用相同的背景颜色。 - Mohammed Housseyn Taleb

0

这是我处理这个问题的新方法:

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

我正在使用这些方法在我的JFrame上隐藏和显示JPanel。
示例按钮代码:
    JFrameTools.showForms(this,searchPanel,false);
    JFrameTools.showForms(this,insertingPanel,true);
    JFrameTools.showForms(this,new jPanel[]{insertingPanel,searchPanel,printingPanel});

同样适用于隐藏。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接