Java 在CardLayout中显示不同的面板大小
我有一个Java 在CardLayout中显示不同的面板大小,java,swing,layout-manager,cardlayout,Java,Swing,Layout Manager,Cardlayout,我有一个JPanel(cardLayoutPanel),它的布局是CardLayout 我还有另外3个不同的面板(firstPagePanel,secondPagePanel,thirdPagePanel) firstPagePanel尺寸约为450x400 secondPagePanel尺寸约为800x600 thirdPagePanel尺寸约为1024x768 IcardLayoutPanel。添加所有3个面板,然后首先显示firstPagePanel作为我的视图 我想让我的程序先显示f
JPanel
(cardLayoutPanel
),它的布局是CardLayout
我还有另外3个不同的面板(firstPagePanel
,secondPagePanel
,thirdPagePanel
)
尺寸约为450x400firstPagePanel
尺寸约为800x600secondPagePanel
尺寸约为1024x768thirdPagePanel
cardLayoutPanel。添加所有3个面板,然后首先显示firstPagePanel
作为我的视图
我想让我的程序先显示firstPagePanel
的大小,即450x400
然后,如果显示secondPagePanel
,它会将大小更改为800x600,如果显示thirdPagePanel
,它会将大小更改为1024768
我没有猜测我的3个面板的大小,而是使用了frame.getPreferredSize()
,但是我的第一个视图总是采用我的thirdPagePanel
的大小,即1024x768而不是450x400
如何解决此问题
public class MainFrame {
private CardLayout cardLayout = new CardLayout();
private JPanel cardLayoutPanel = new JPanel();
private FirstPagePanel firstPagePanel = new FirstPagePanel();
private SecondPagePanel secondPagePanel = new SecondPagePanel();
private ThirdPagePanel thirdPagePanel = new ThirdPagePanel();
private JFrame frame = new JFrame("Panel size test");
public MainFrame() {
cardLayoutPanel.setLayout(cardLayout);
cardLayoutPanel.add(firstPagePanel,"1");
cardLayoutPanel.add(secondPagePanel,"2");
cardLayoutPanel.add(thirdPagePanel,"3");
cardLayout.show(cardLayoutPanel,"1");
frame.add(cardLayoutPanel);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.pack();
frame.getPreferredSize();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
frame.setResizable(false);
}
}
最简单的方法是:
- 卸下当前面板
- 添加新面板
- 将顶层容器打包
例如。
import java.awt.*;
导入java.awt.event.*;
导入java.awt.image.buffereImage;
导入javax.swing.*;
导入javax.swing.border.EmptyBorder;
公共类3sizegui{
公共静态无效swapComponentsAndResizeUI(
JComponentUI,
j组件电流,
JComponent(下一步){
ui.删除(当前);
ui.add(下一步);
当前=下一个;
组件c=ui.getToLevel祖先();
如果(窗口的c实例){
窗口w=(窗口)c;
w、 包装();
}
}
公共静态void main(字符串[]args){
Runnable r=新的Runnable(){
@凌驾
公开募捐{
最终JPanel ui=新JPanel(新边界布局(4,4));
ui.setboorder(新的空订单(6,6,6,6));
JPanel控件=新JPanel(
新的FlowLayout(FlowLayout.LEADING));
添加(控件、边框布局、页面开始);
int s=100;
维度[]大小={
新尺寸(s*4,s*2),
新尺寸(s*6,s*3),
新尺寸(s*8,s*4)
};
最终JCOMBOX cb=新JCOMBOX(尺寸);
控制。添加(cb);
最终JPanel[]面板=新JPanel[size.length];
对于(int ii=0;ii
我会问为什么。这种“跳跃”对于用户来说是非常烦躁和恼人的,因为如果我将第一页面板的大小保持在第三页面板的大小,它看起来会很奇怪
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
import javax.swing.border.EmptyBorder;
public class ThreeSizeGui {
public static void swapComponentsAndResizeUI(
JComponent ui,
JComponent current,
JComponent next) {
ui.remove(current);
ui.add(next);
current = next;
Component c = ui.getTopLevelAncestor();
if (c instanceof Window) {
Window w = (Window) c;
w.pack();
}
}
public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
final JPanel ui = new JPanel(new BorderLayout(4, 4));
ui.setBorder(new EmptyBorder(6, 6, 6, 6));
JPanel controls = new JPanel(
new FlowLayout(FlowLayout.LEADING));
ui.add(controls, BorderLayout.PAGE_START);
int s = 100;
Dimension[] sizes = {
new Dimension(s * 4, s * 2),
new Dimension(s * 6, s * 3),
new Dimension(s * 8, s * 4)
};
final JComboBox cb = new JComboBox(sizes);
controls.add(cb);
final JPanel[] panels = new JPanel[sizes.length];
for (int ii = 0; ii < sizes.length; ii++) {
Dimension d = sizes[ii];
BufferedImage bi = new BufferedImage(
d.width, d.height, BufferedImage.TYPE_INT_RGB);
JPanel p = new JPanel(new GridLayout());
JLabel l = new JLabel(new ImageIcon(bi));
p.add(l);
panels[ii] = p;
}
ItemListener sizeListener = new ItemListener() {
JPanel current = panels[0];
@Override
public void itemStateChanged(ItemEvent e) {
JPanel next = panels[cb.getSelectedIndex()];
swapComponentsAndResizeUI(ui, current, next);
current = next;
}
};
cb.addItemListener(sizeListener);
ui.add(panels[0], BorderLayout.CENTER);
JFrame f = new JFrame("Three Sized Panels");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setContentPane(ui);
f.pack();
f.setLocationByPlatform(true);
f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}