2013-04-23 2 views
0

JLayeredPane을 사용하여 패널을 다른 패널보다 가운데에 배치하는 패널을 만들려고합니다. 그래도 작은 패널을 표시 할 수는 없습니다. 내가 뭘 잘못하고 있는지에 대한 어떤 생각?JLayeredPane의 최상위 레이어가 표시되지 않습니다.

import java.awt.Dimension; 

import javax.swing.BoxLayout; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 

public class MainPanel extends JPanel { 
private JLayeredPane pane; 
private AllPlayersPanel players; //Larger panel, uses circleLayout 
private GamePanel game; //Smaller panel, simple BorderLayout 

public MainPanel(){ 
    super(); 
    setSize(900, 900); 
    setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));  

    pane = new JLayeredPane(); 
    pane.setPreferredSize(new Dimension(900, 900));  

    players = new AllPlayersPanel(); 
    players.setPreferredSize(players.getPreferredSize()); 
    players.setLocation(0,0); 
    //players.setOpaque(false); 
    pane.add(players, new Integer(0)); 

    game = new GamePanel(); 
    game.setPreferredSize(game.getPreferredSize()); 
    game.setLocation(385, 405); 
    //game.setOpaque(false);   
    pane.add(game, new Integer(2)); 

    add(pane); 
} 

public static void main(String[] args) { 
    JFrame frame = new JFrame(); 
    JComponent newPane = new MainPanel(); 
    newPane.setOpaque(true); 
    frame.setContentPane(newPane); 
    frame.pack(); 
    frame.setVisible(true); 
} 

} 

저는 .setOpaque()의 모든 조합을 시도해 봤습니다.

CircleLayout는 당신이 필요하지 않을 때 당신이하고 preferredSize 안 할 때 기본적으로, 당신은 예를 들어

... setSize을 사용하고

답변

1

here를 찾을 수 있습니다. 당신이 setSize(900, 900);를 호출 MainPanel의 당신 생성자에서

당신은 당신이 추가 패널에 다음 getPreferredSize을 재정의해야 JLayeredPane 당신이 setPreferredSize를 호출하고 있지만 JLayeredPane이 값을 확인하는 아무 레이아웃 매니저가 없습니다, 그래서 이 패널의 크기는 0x0으로 유지됩니다.

게다가, 난 당신이 기본적으로 어떤 방법을 0x0으로 선호하는 크기를 설정할 것이다, players.setPreferredSize(players.getPreferredSize());를 호출 얻을 것으로 예상 모르겠어요 : P

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 
import javax.swing.BoxLayout; 
import javax.swing.JComponent; 
import javax.swing.JFrame; 
import javax.swing.JLayeredPane; 
import javax.swing.JPanel; 
import javax.swing.border.LineBorder; 

public class MainPanel extends JPanel { 

    private JLayeredPane pane; 
    private JPanel players; //Larger panel, uses circleLayout 
    private JPanel game; //Smaller panel, simple BorderLayout 

    public MainPanel() { 
     super(); 
//  setSize(900, 900); 
//  setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS)); 
     setLayout(new BorderLayout()); 

     pane = new JLayeredPane(); 
//  pane.setPreferredSize(new Dimension(900, 900)); 
     pane.setBorder(new LineBorder(Color.RED)); 

     players = new JPanel(); 
     players.setBackground(Color.RED); 
     players.setSize(getPreferredSize()); 
     players.setLocation(0, 0); 
     //players.setOpaque(false); 
     pane.add(players, new Integer(0)); 

     game = new JPanel(); 
     game.setSize(game.getPreferredSize()); 
     game.setBackground(Color.BLUE); 
     game.setLocation(385, 405); 
     //game.setOpaque(false);   
     pane.add(game, new Integer(2)); 

     add(pane); 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(900, 900); 
    } 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     JComponent newPane = new MainPanel(); 
     newPane.setOpaque(true); 
     frame.setContentPane(newPane); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
} 
+0

감사합니다. 그건 분명히 문제였습니다. setSize() 및 setPreferredSize()를 사용하는 방법에 대한 팁? 나는 분명히 잘하는 법을 알지 못하기 때문에. – JZachow

+1

'setPreferredSize'를 사용하지 말고'getPreferredSize'를 오버라이드해야합니다. 'preferredSize'는 배치 관리자가 구성 요소를 배치하는 방법에 대한 힌트를 제공하는 데 사용됩니다. 'setSize'는 1- 레이아웃 관리자를 사용하지 않는 경우 ('JLayeredPane'과 같이) 또는 2 - 자신 만의 레이아웃 관리자를 만들 때 – MadProgrammer

+0

고마워요. 바라건대 지금 나는 그것을 바로 지킬 수있다. – JZachow