如何正确使用JPanel作为其他几个JPanel的容器?

时间:2014-03-26 22:13:55

标签: java swing user-interface layout jpanel

我在Swing中设计GUI。我想要我的gui的特定区域 - 中心视图 - 能够更改其显示以响应动作事件。无论显示什么内容,中心视图的大小都不得改变。

现在,如果我的JPanel panel1具有优先级并将其放入panel2而没有任何指定的大小,则panel2将完全按照panel1的显示;你甚至看不到双JPanel层。但由于我的中心框架(panel2)不应该改变大小,我尝试将panel2设置为特定大小并给它BorderLayout。现在,如果我调用panel2.add(panel1, BorderLayout.center ),其中panel1与panel2具有完全相同的尺寸,则会显示双JPanel图层,并且中心视图显示为错误。

如何将panel1添加到panel2,其中两个都具有相同的尺寸,因此panel2不可见?或者更好的是,我该怎么做呢? (简单LayoutManagers

1 个答案:

答案 0 :(得分:4)

我会回答这个问题,因为这是对这个问题的规范回答:

使用CardLayout。您可以找到教程here。 CardLayout非常适合确保中心JPanel(持卡人JPanel)不会改变尺寸。您可以从几乎任何控制结构交换卡,无论是JButton持有的ActionListener还是JComboBox。

例如:

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import javax.swing.*;

@SuppressWarnings("serial")
public class CardExample extends JPanel {
   enum MyColor {
      RED("Red", Color.RED), YELLOW("Yellow", Color.YELLOW), BLUE("Blue",
            Color.BLUE);
      private String name;
      private Color color;

      private MyColor(String name, Color color) {
         this.name = name;
         this.color = color;
      }

      public String getName() {
         return name;
      }

      public Color getColor() {
         return color;
      }
   }

   private static final int GAP = 3;

   private CardLayout cardlayout = new CardLayout();
   private JPanel cardHolderPanel = new JPanel(cardlayout);

   public CardExample() {
      JPanel btnPanel = new JPanel(new GridLayout(1, 0, GAP, GAP));
      for (MyColor myColor : MyColor.values()) {
         JPanel cardPanel = new JPanel();
         cardPanel.setPreferredSize(new Dimension(200, 200));
         cardPanel.setBackground(myColor.getColor());
         cardHolderPanel.add(cardPanel, myColor.getName());

         btnPanel.add(new JButton(new ButtonAction(myColor)));
      }

      setLayout(new BorderLayout(GAP, GAP));
      setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
      add(cardHolderPanel, BorderLayout.CENTER);
      add(btnPanel, BorderLayout.SOUTH);
   }

   private class ButtonAction extends AbstractAction {
      private MyColor myColor;

      public ButtonAction(MyColor myColor) {
         super(myColor.getName());
         this.myColor = myColor;
      }

      @Override
      public void actionPerformed(ActionEvent e) {
         cardlayout.show(cardHolderPanel, myColor.getName());
      }
   }

   private static void createAndShowGui() {
      JFrame frame = new JFrame("CardExample");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(new CardExample());
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

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