2012-05-05 4 views
2

다음 JFrame이 있습니다.JFrame에 JPanel을 여러 개 추가 할 수 없습니다.

public class AddActivityWindow extends JFrame { 

    //declaration of components go here 
    ... 
    public AddActivityWindow(ActivityStore store) { 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel pnl_date = new JPanel(); 
     JLabel lbl_date = new JLabel("X"); 
     pnl_date.add(lbl_date); 
     add(pnl_date); 


     pnl_activities = new JPanel(); 
     JLabel lbl_act = new JLabel("Y"); 
     pnl_activities.add(lbl_act); 
     add(pnl_activities); 

     setLocationRelativeTo(null); 
     setVisible(true); 

    } 
} 

이 프레임을 만들면 두 개의 패널이있는 프레임이 생성 될 것으로 예상됩니다. 하지만 두 번째 패널 (예 :) 만 볼 수 있으며 X이 아닙니다. 그러나 두 번째 패널에 대한 코드를 제거하면 X을 볼 수 있습니다.

두 번째 패널을 추가하면 어떻게됩니까? 첫 번째 패널이 프레임에 나타나지 않는 이유는 무엇입니까?

+3

그렇지 않으면 그들은 확실히 서로 겹치는 것, 여기에 패널을 추가하기 전에 JFrame의 몇 가지'layout'를 사용합니다 .. – Asif

답변

6

다른 레이아웃 관리자를 사용하고 있습니다. 보시려면 을 선택하십시오.

이 나를 위해 잘 작동

import java.awt.FlowLayout; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.SwingUtilities; 

public class FrameTest extends JFrame { 

    public FrameTest() { 
     setLayout(new FlowLayout()); 
     setSize(150, 150); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JPanel pnl_date = new JPanel(); 
     JLabel lbl_date = new JLabel("X"); 
     pnl_date.add(lbl_date); 
     add(pnl_date); 


     JPanel pnl_activities = new JPanel(); 
     JLabel lbl_act = new JLabel("Y"); 
     pnl_activities.add(lbl_act); 
     add(pnl_activities); 

     setLocationRelativeTo(null); 
     setVisible(true); 

    } 

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

      @Override 
      public void run() { 
       new FrameTest().setVisible(true); 

      } 
     }); 
    } 
} 
7

JFrame의 기본 레이아웃은 BorderLayout입니다. BorderLayout의 특성은 각 영역에 하나의 구성 요소 만 포함 할 수 있다는 것입니다. 제약 조건을 지정하지 않고 add 메서드를 사용하는 경우 구성 요소를 CENTER에 추가하는 것과 같습니다. 따라서 두 번째 add 호출은 처음 추가 한 요소를 대체합니다.

가능한 솔루션 : 제약 조건을 지정, 예컨대

add(pnl_date, BorderLayout.NORTH); 
//... 
add(pnl_activities, BorderLayout.CENTER); 

또는 다른 레이아웃 매니저로 전환 (예를 들어, BoxLayout 또는 FlowLayout) 당신의 JFrame합니다. 그것은 당신의 필요에 달려 있습니다. 관리자를 선택하기위한 좋은 출발점 인 Visual guide to layout managers을 살펴보십시오.

관련 문제