2014-02-27 4 views
0

하나의 단일 프레임에 4 개의 다른 패널로 인터페이스를 설계하려고합니다. 아래에 포함 된 코드에 2 개의 패널 설명을 포함 시켰습니다. 다음은다른 레이아웃의 프레임에있는 4 개의 패널

내 코드의 일부입니다

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

이 코드는 (그것은 단지 이상한 크기 (내가 원하지 않는 것)에서 마지막 패널을 표시) 작동하지 않습니다. 그러나 프레임 클래스 (그리고 개별 패널 클래스가 아닌) 내에서 다른 패널을 설정하면 완벽하게 작동합니다. 왜 다른 패널 클래스를 사용할 수 없으며 이후에 모든 패널 클래스를 마지막 프레임 클래스에 추가 할 수 있습니까?

프레임 클래스 내에 설정된 패널을 포함하고 프레임 레이아웃을 포함하면 (방금 언급 한 것처럼) 작동합니다. 그러나 프레임 클래스 내에 패널을 포함 시키지만 프레임 레이아웃을 포함하지 않으면 프레임 레이아웃을 사용하여 마지막 패널 만 표시합니다. 왜 다른 패널을 묘사하지 않는거야?

감사합니다.

답변

0

기본적으로 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); 
    } 
} 
+0

'JFrame'는'FlowLayout'입니다. 안 그래? – Sarz

+1

'JFrame'의 테두리가'FlowLayout'입니까? 기본적으로'JFrame'의'LayoutManager'는'BorderLayout'입니다. 설명서는 다음과 같이 말합니다 : _ 기본 내용 창에 BorderLayout 관리자가 설정되어 있습니다 ._''JFrame'의'add()'메소드가'content pane'에 직접'components '를 추가하기 때문에 작동합니다. 그것은'FlowLayout'이 아닙니다. –

+0

왜 내가 추가 한 마지막 패널 만 보이고 있습니까? 이것은 기본 프레임 레이아웃과 관련이 있습니까? – vmck

0

먼저 귀하의 경우 최소한 네 JPanel가 포함 된 프레임을해야한다. 개별적으로 각각의 패널을 만들어이 같은 JFrame 뭔가를 추가하는 대신 일부를 탐험 GridLayout을 사용하여 테두리 THER 기본으로

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

이'new Panel2()'는 생성자가 반환 유형이 없음을 의미하고,'getPanel()'은'JPanel'을 반환하는 메소드입니다. 우리 차가워 요? @AwfullyAwesome – Sarz

+0

글쎄, 나는 컨스트럭터의 컨텍스트에서만 말하고 있었다.'Panel2()'이'constructor'이라면,'getPanel()'메소드를 추가 할 필요가 없습니다. 당신이 나를 믿지 않는다면, IDE에서 확인해보십시오. :) –