【问题标题】:Top layer in JLayeredPane not displayingJLayeredPane 中的顶层未显示
【发布时间】:2013-04-23 04:33:17
【问题描述】:

我正在尝试创建一个面板,该面板使用 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 可以找到here

【问题讨论】:

    标签: java swing jpanel jlayeredpane


    【解决方案1】:

    基本上,你不应该使用setSize,而你不需要使用preferredSize...

    例如。

    MainPanel 的构造函数中,当您应该覆盖getPreferredSize 时调用setSize(900, 900);,然后在要添加到JLayeredPane 的面板上调用setPreferredSize,但JLayeredPane 没有用于检查此值的布局管理器,因此这些面板的大小保持为 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);
        }
    }
    

    【讨论】:

    • 谢谢。这绝对是问题所在。关于何时使用 setSize() 和 setPreferredSize() 的任何提示?因为我显然不知道该怎么做。
    • 您不应使用setPreferredSize,而应覆盖getPreferredSizepreferredSize 用于向布局管理器提供有关您的组件希望如何布局的提示。 setSize 仅应在以下情况下使用:1- 您没有使用布局管理器(与 JLayeredPane 一样)或 2- 您正在创建自己的布局管理器
    • 谢谢。希望我现在可以保持直截了当。
    猜你喜欢
    • 2013-12-08
    • 1970-01-01
    • 2011-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多