2014-02-27 34 views
0

我试图在一个单一的框架中设计一个有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类中?如果我在框架类中设置面板并包含框架布局,那么它就可以工作(正如我刚刚提到的那样)。但是,如果我在框架类中包含设置的面板,但不包含框架布局,那么它仅使用框架布局显示最后一个面板。为什么它不描绘任何其他面板?

谢谢!

回答

0

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

所以添加任何panelFrame,你可以这样做以下:

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); 

这些数值工作,是有效的。 如果您将四个不同的面板从上面四个不同的位置添加到您的框架中,那么您的面板将可见。

这里有一个演示使用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); 
    } 
} 
+0

默认疗法的边界'JFrame'是'FlowLayout'。不是吗? – Sarz

+1

'JFrame'作为'FlowLayout'的边界?默认情况下'JFrame'的'LayoutManager'是'BorderLayout'。该文档说:_默认的内容窗格将有一个BorderLayout管理器设置它。因为'JFrame'中的add()'方法现在直接将'components'添加到它的'content pane',它就可以工作。它不是'FlowLayout'。 –

+0

为什么它只显示我添加的最后一个面板?这是否与默认的框架布局有关? – vmck

0

你必须先使你的帧至少包含四个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); 
+0

如果Panel2,Panel3等是'JPanel',则不需要执行getPanel()。 –

+0

是'新的Panel2()'是构造函数意味着没有返回类型,'getPanel()'是返回'JPanel' ..的方法。我们很酷吗? @AwfullyAwesome – Sarz

+0

嗯,我只是在构造函数的背景下说。如果'Panel2()'是'构造函数',则不需要添加'getPanel()'方法。如果你不相信我,请在IDE上查看。 :) –