2014-02-27 43 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上查看。 :) –