【问题标题】:Four Panel in Frame with Different Layout框架中的四个面板具有不同的布局
【发布时间】:2014-02-27 17:59:31
【问题描述】:

我正在尝试设计一个在 1 个单帧中包含 4 个不同面板的界面。我在下面包含的代码中包含了 2 个面板描述。

以下是我的部分代码:

public class finalFrame extends JFrame {
       PanelA a = new PanelA()
       PanelB b = new PanelB()
       // ...
      public finalFrame() {
          super();
          setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
          //...
          //...
          //...
          add(a);
          add(b);
          } 
}
class PanelA extends JPanel {
      JButton bt = new JButton();
      add(bt);
     //...
  }

class PanelB extends JPanel {
// ...
//... }

class Program {
      public static void main(String [] args) {
            finalFrame fr = new finalFrame();
      }
 }

这段代码似乎不起作用(它只以奇怪的大小显示最后一个面板(不是我想要的))。然而,当我在框架类(而不是单独的面板类)中设置不同的面板时,它工作得很好。为什么我不能使用不同的面板类,然后将它们全部添加到最终的 Frame 类中?

此外(抱歉所有问题),如果我在框架类中包含设置的面板并包含框架布局,那么它可以工作(正如我刚才提到的)。但是,如果我包含在框架类中设置的面板但我不包含框架布局,那么它只会显示使用框架布局的最后一个面板。为什么它不描绘任何其他面板??

谢谢!!

【问题讨论】:

    标签: java layout panels


    【解决方案1】:

    在您的情况下,您必须首先使您的框架包含至少四个 JPanel。使用GridLayout 探索一些,而不是单独制作每个面板并添加JFrame 像这样:

    frame.setLayout(new GridLayout(2,2));
    frame.add(new Panel2().getPanel());
    frame.add(new Panel2().getPanel());
    frame.add(new Panel3().getPanel());
    frame.add(new Panel4().getPanel());
    frame.setSize(100,100);
    frame.setVisible(true);
    

    【讨论】:

    • 如果Panel2Panel3等是JPanels,则不需要getPanel()
    • is new Panel2() 是构造函数意味着没有返回类型,getPanel() 是返回JPanel 的方法。我们很酷吗? @AwfullyAwesome
    • 好吧,我只是在构造函数的上下文中说。如果Panel2()constructor,则无需添加getPanel() 方法。如果您不相信我,请在 IDE 上查看。 :)
    • Container.add(String,Component) is not applicable argument mismatch for this.add( new Panel(),BorderLayout.NORTH); where no error for this.add( new Panel().getPanel(),BorderLayout.NORTH); 请你举个例子
    • 我明白了,这就是为什么我也为你投票的原因,在旧版本的 JDK 4 或 5 中,JFrame 默认布局是 FlowLayout 在大学时研究过的,我记得 :):)
    【解决方案2】:

    默认情况下,Java 中的FramesBorderLayout 作为其LayoutManager

    所以要将任何panel 添加到Frame,您可以执行以下操作:

    frame.add(panel, BorderLayout.NORTH);
    frame.add(panel, BorderLayout.WEST);
    frame.add(panel, BorderLayout.SOUTH);
    frame.add(panel, BorderLayout.EAST);
    frame.add(panel, BorderLayout.CENTER);
    

    这些值有效且有效。 如果您在将四个不同面板添加到框架时使用上面的 4 个不同位置,那么您的面板将可见。

    这是一个使用GridLayout添加四个面板的演示:

    import java.awt.Color;
    import java.awt.GridLayout;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.SwingUtilities;
    
    public class GridFrame extends JFrame
    {
      private static final long serialVersionUID = 1L;
    
      public GridFrame()
      {
        super("Grid Demo");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new GridLayout(2, 2));
    
        add(new PanelA());
        add(new PanelB());
        add(new PanelC());
        add(new PanelD());
    
        setSize(500, 500);
        setLocationRelativeTo(null);
        setVisible(true);
      }
    
      public static void main(String[] args)
      {
        // Call Swing stuff like this, since Swing is not thread safe.
        SwingUtilities.invokeLater(new Runnable()
        {
          @Override
          public void run()
          {
            new GridFrame();
          }
        });
      }
    }
    
    class PanelA extends JPanel
    {
      private static final long serialVersionUID = 1L;
    
      public PanelA()
      {
        setBackground(Color.RED);
      }
    }
    
    class PanelB extends JPanel
    {
      private static final long serialVersionUID = 1L;
    
      public PanelB()
      {
        setBackground(Color.BLUE);
      }
    }
    
    class PanelC extends JPanel
    {
      private static final long serialVersionUID = 1L;
    
      public PanelC()
      {
        setBackground(Color.YELLOW);
      }
    }
    
    class PanelD extends JPanel
    {
      private static final long serialVersionUID = 1L;
    
      public PanelD()
      {
        setBackground(Color.GREEN);
      }
    }
    

    【讨论】:

    • 默认情况下 JFrame 的边框是 FlowLayout 。不是吗?
    • JFrame 的边界为FlowLayout?默认情况下JFrameLayoutManagerBorderLayout。文档说:默认内容窗格将设置一个 BorderLayout 管理器。 并且由于 JFrame 中的 add() 方法现在直接将 components 添加到其 content pane,因此它可以工作。它不是FlowLayout
    • 为什么它只显示我添加的最后一个面板?这是否与默认框架布局有关?
    • 如果您正在谈论的是您的代码,那么是的。当你做add(a);时,框架在center中添加组件a,然后当你做add(b);时,框架又在中心添加组件,有效地覆盖了之前添加的组件。使用上面我在代码中显示的布局提示,然后您可以轻松解决问题。
    • @vmck:您可以查看我更新的答案中的演示代码以获得更多见解。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-26
    • 1970-01-01
    • 2020-06-13
    • 1970-01-01
    相关资源
    最近更新 更多