2013-04-23 73 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可以基本上,你正在使用setSize时,你不应该和preferredSize当你不需要......

例如找到here

回答

1

在你打电话setSize(900, 900);MainPanel的构造函数时,你应该重写getPreferredSize那么你要添加到面板上的JLayeredPane你调用setPreferredSizeJLayeredPane具有用来检查这个值没有布局管理器,所以这些面板的大小保持为0x0。

除此之外,我不知道你预计将从调用players.setPreferredSize(players.getPreferredSize());,这基本上将设置首选的大小为0x0任何方式来获得什么: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 2013-04-23 04:56:27

+1

您不应该使用'setPreferredSize',而应该重写'getPreferredSize'。 'preferredSize'用于向布局经理提供有关组件喜欢如何布局的提示。 'setSize'只能用于1-你没有使用布局管理器(就像'JLayeredPane'的情况那样)或者2-你正在创建你自己的布局管理器 – MadProgrammer 2013-04-23 04:58:32

+0

谢谢。希望我现在可以保持直立。 – JZachow 2013-04-23 05:19:23