如何从最小 window 大小更改 JFrame 大小?

How do I change JFrame size from the minimum window size?

我正在尝试学习如何使用 CardLayout 而不是多个 JFrames,我正在弄乱我在 youtube 上找到的这段代码。我尝试在所有 JPanes 上调用 setSize() 但它不会更改大小并且它保持在最小 window 大小。我无法设置大小的原因是因为这行代码:"panelCont.setLayout(cl);" ?

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class CLayout {
    JFrame frame = new JFrame("CardLayout");
    JPanel panelCont = new JPanel();
    JPanel panelFirst = new JPanel();
    JPanel panelSecond = new JPanel();
    JButton buttonOne = new JButton("Switch to second panel");
    JButton buttonSecond = new JButton("Switch to first panel");
    CardLayout cl = new CardLayout();

    public CLayout() {
        panelCont.setLayout(cl);

        panelFirst.add(buttonOne);
        panelSecond.add(buttonSecond);
        panelFirst.setBackground(Color.BLUE);
        panelSecond.setBackground(Color.GREEN);

        panelCont.add(panelFirst, "1");
        panelCont.add(panelSecond, "2");
        cl.show(panelCont, "1");

        buttonOne.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                cl.show(panelCont, "2");
            }
        });

        buttonSecond.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                cl.show(panelCont, "1");
            }
        });
        frame.add(panelCont);
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);

    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new CLayout();
            }
        });
    }
}

是的,它适用于 CardLayout,但也可以调整大小。例如,您可以嵌套 JPanel。或使用这样的东西: 代码

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.border.Border;

public class MultiSizedPanels {

private static void createAndShowUI() {
   final CardLayout cardLayout = new CardLayout();
   final JPanel cardHolder = new JPanel(cardLayout);

   JLabel[] labels = {
      new JLabel("Small Label", SwingConstants.CENTER),
      new JLabel("Medium Label", SwingConstants.CENTER),
      new JLabel("Large Label", SwingConstants.CENTER)};

   for (int i = 0; i < labels.length; i++) {
      int padding = 50;
      Dimension size = labels[i].getPreferredSize();
      size = new Dimension(size.width + 2 * (i + 1) * padding, size.height + 2 * (i + 1) * padding);
      labels[i].setPreferredSize(size);
      Border lineBorder = BorderFactory.createLineBorder(Color.blue);
      labels[i].setBorder(lineBorder);
      JPanel containerPanel = new JPanel(new GridBagLayout());
      containerPanel.add(labels[i]);
      cardHolder.add(containerPanel, String.valueOf(i));
   }

   JButton nextButton = new JButton("Next");
   nextButton.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent e) {
            cardLayout.next(cardHolder);
         }
      });
   JPanel btnHolder = new JPanel();
   btnHolder.add(nextButton);

   JFrame frame = new JFrame("MultiSizedPanels");
   frame.getContentPane().add(cardHolder, BorderLayout.CENTER);
   frame.getContentPane().add(btnHolder, BorderLayout.SOUTH);

   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   frame.pack();
   frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

其中组件(这里是 JLabel 而不是 JPanel)设置了 preferredSize,然后将它放在另一个 JPanel 中。

希望对您有所帮助。