我有一个窗口,因为我动态更改它的子组件(有时我交换JPanels),所以我找不到其他解决方法,只能在窗口上调用pack()来显示新的元素。否则,它只会在我手动调整窗口大小后才会显示出来。
但是,这样做的问题是,如果窗口被最大化了,在pack()之后它将不再是最大化的,这不是我想给客户的结果。
有何解决办法?
但是,这样做的问题是,如果窗口被最大化了,在pack()之后它将不再是最大化的,这不是我想给客户的结果。
有何解决办法?
CardLayout
进行面板切换,因为这种功能已经内置于该特定布局管理器中。通常情况下,您需要在容器上调用validate
/revalidate
和repaint
来刷新显示。
另请参阅:
int state = frame.getExtendedState();
frame.pack();
frame.setExtendedState(JFrame.MAXIMIZED_BOTH);
我遇到了和你一样的问题,但是我对我的解决方案感到满意,我分享出来,也许可以帮助你解决你的问题。
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);
这对我来说完美地运作。
这是我处理这个问题的新方法:
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();
}
}
JFrameTools.showForms(this,searchPanel,false);
JFrameTools.showForms(this,insertingPanel,true);
JFrameTools.showForms(this,new jPanel[]{insertingPanel,searchPanel,printingPanel});
同样适用于隐藏。