java GUI中的CardLayout()

在我的代码中,目前每张卡都是我的框架的大小。 如何在布局中设置每个面板的不同尺寸。 我尝试通过调用run()方法并更改框架的大小来使框架具有不同的大小,但它不起作用。 我希望还有另一种方式。 这是我的代码:

import java.awt.*; import java.awt.event.*; import javax.swing.*; import javax.swing.event.*; public class GameManager { JFrame frame; JPanel cards,Title; public GameManager() { cards = new JPanel(new CardLayout()); Title title = new Title(); cards.add(title,"title"); CardLayout cl = (CardLayout)(cards.getLayout()); cl.show(cards, "title"); } public static void main(String [] args) { GameManager gm = new GameManager(); gm.run(); } public void run() { frame = new JFrame("Greek Olympics"); frame.setSize(1000,1000); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.getContentPane().add(cards); frame.setVisible(true); CardLayout cl = (CardLayout)(cards.getLayout()); cl.show(cards, "title"); } public class Title extends JPanel { public void paintComponent(Graphics g) { super.paintComponent(g); g.fillRect(100,100,100,100); } } } 

如果我想添加另一个不同大小的面板,我将如何更改代码?

如何在布局中设置每个面板的不同尺寸

首先,要了解CardLayout将使用其管理的所有视图的preferredSize属性来确定其管理的容器应使用的最佳结果大小。 这意味着如果你在框架上调用pack (而不是setSize ),它将被调整(自动)到管理的最大组件(由CardLayout

如果我想添加另一个不同大小的面板,我将如何更改代码?

您添加到CardLayout每个组件应该通过一个或多个相应的布局管理器计算它的大小,或者在自定义组件的情况下,通过getPreferredSize方法提供大小提示

 public class Title extends JPanel { @Override public Dimension getPreferredSize() { return new Dimension(200, 200); } @Override protected void paintComponent(Graphics g) { super.paintComponent(g); g.fillRect(100,100,100,100); } } 

然后,使用pack ,而不是使用setSize

 public void run() { frame = new JFrame("Greek Olympics"); //frame.setSize(1000,1000); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.add(cards); frame.pack(); CardLayout cl = (CardLayout)(cards.getLayout()); cl.show(cards, "title"); frame.setVisible(true); } 

例…

这是一个基本示例,它设置了两个面板,一个是preferredSize200x200 ,另一个是400x400

当你运行它时,你会发现窗口至少是400x400 ,两个面板的大小都是一样的

 import java.awt.BorderLayout; import java.awt.CardLayout; import java.awt.Color; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class Test { public static void main(String[] args) { new Test(); } public Test() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { ex.printStackTrace(); } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); CardLayout cardLayout = new CardLayout(); JPanel base = new JPanel(cardLayout); base.add(makePanel(200, 200, Color.RED), "red"); base.add(makePanel(400, 400, Color.BLUE), "blue"); frame.add(base); JButton blue = new JButton("Blue"); blue.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { cardLayout.show(base, "blue"); } }); JButton red = new JButton("red"); red.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { cardLayout.show(base, "red"); } }); JPanel buttons = new JPanel(); buttons.add(red); buttons.add(blue); frame.add(buttons, BorderLayout.SOUTH); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public TestPane makePanel(int width, int height, Color background) { TestPane pane = new TestPane(new Dimension(width, height)); pane.setBackground(background); return pane; } public class TestPane extends JPanel { private JLabel label; private Dimension preferredSize; public TestPane(Dimension size) { label = new JLabel("..."); setLayout(new GridBagLayout()); add(label); this.preferredSize = size; } @Override public Dimension getPreferredSize() { return preferredSize; } @Override public void invalidate() { super.invalidate(); label.setText(getWidth() + "x" + getHeight()); } } }