Java 如何定制JPanel在JPanel中的位置

Java 如何定制JPanel在JPanel中的位置,java,swing,layout,jpanel,Java,Swing,Layout,Jpanel,该类扩展了JPanel public void createDisplay(){ frame = new JFrame(); frame.setTitle(title); frame.setSize(new Dimension(width, height)); frame.setVisible(true); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFra

该类扩展了JPanel

 public void createDisplay(){
    frame = new JFrame();
    frame.setTitle(title);
    frame.setSize(new Dimension(width, height));
    frame.setVisible(true);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    this.setPreferredSize(new Dimension(width, height));
    this.setMaximumSize(new Dimension(width, height));
    this.setMinimumSize(new Dimension(width, height));

    this.setLayout(null); //have tried default and BorderLayout
    this.setSize(new Dimension(width, height));
    this.setBounds(0, 0, width, height);

    //basically trying everything

    frame.add(this);
    frame.pack();

}
在启动时,这段代码运行良好,JPanel完全覆盖了父帧的大小

但是,我的程序稍后尝试向类的extend JPanel添加一个新的JPanel,方法是:

    public void gameOverWindow(){ ;
    JPanel panel = new JPanel(new BorderLayout());
    panel.setPreferredSize(new Dimension(200, 100));
    JLabel label = new JLabel("Game Over");
    label.setPreferredSize(new Dimension(40, 15));

   //trying setPosition also doesn't work with BorderLayout or FlowLayout

    JButton button_01 = new JButton("new");
    button_01.setPreferredSize(new Dimension(100, 10));
    JButton button_02 = new JButton("exit");
    button_02.setPreferredSize(new Dimension(100, 10));


    panel.add(label, BorderLayout.NORTH);
    panel.add(button_01, BorderLayout.WEST);
    panel.add(button_02, BorderLayout.EAST);



    this.add(panel);
    this.revalidate();


}

这个新的JPanel以正确的BorderLayout格式显示内容,但是JPanel本身将保持在扩展JPanel的顶部中心,我知道这是因为默认布局设置为FlowLayout,但是将其设置为BorderLayout只会导致面板占据整个屏幕。将布局设置为null会完全打断框架,除了框架的最小化和关闭按钮外,不会显示任何内容。试图设置此JPanel的位置或边界也不能用于任何布局。我在网上读了很多关于这一点的帖子,但它们似乎都有所不同,令人困惑,我如何控制我的新JPanel的位置?

通常我建议使用a在不同的视图之间切换,但从可用的信息中很难确定这是否有帮助

相反,您可以使用复合布局。即使用不同的布局将一个容器包装到另一个容器中

在本例中,我只使用了
BorderLayout
gridbagloayout

删除不同面板的组件而不是直接将其添加到GridBagLayout的目的是什么

因为它们会干扰其他组件的布局

然后我想要一个小的Jpanel在里面弹出并且不引人注目

您可以使用框架的
glassPane
或使用
overlylayout

例如:


这些信息中的大部分都应该出现在您最初的问题中,这样可以减少彼此的时间浪费

*但是JPanel本身将保持在扩展JPanel的顶部中心“*-这就是
面板的作用。add(label,BorderLayout.NORTH);
将如何控制我的新JPanel的位置?“-使用适当的布局。避免使用
setXxxSize
setSize
setBounds
setLocation
如果不使用单一布局管理器,可以使用多个容器,将它们与不同的布局组合在一起managers@MadProgrammer该面板的标签和按钮布局良好,这是我想要移动的JPanel面板的实际位置,尝试一下。add(panel,BorderLayout.center)也不会改变它,因此,您正在将面板添加到面板中,对吗?@正确,并且该面板被添加到JFrame中,因此我的扩展JPanel包含通过游戏循环更新的图形内容,然后我想要一个小的Jpanel在里面弹出并且不引人注目,是否可以使用GridBagLayout创建一个可以定位的小面板?移除不同面板的组件而不是直接添加到GridBagLayout的目的是什么?“移除不同面板的组件而不是直接添加到GridBagLayout的目的是什么?”因为它们会干扰其他组件的布局。“然后我想要一个小的Jpanel弹出并保持低调”-利用框架的
JLayerdPane
或使用
overlylayout
-这些信息中的大部分应该在您最初的问题中
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static void main(String[] args) {
        new Test();
    }

    public Test() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            setLayout(new BorderLayout());
            JButton gameOver = new JButton("Game over man");
            gameOver.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    JPanel panel = new JPanel(new BorderLayout());
                    panel.add(new JLabel("Game Over Man", JLabel.CENTER), BorderLayout.NORTH);
                    panel.add(new JButton("New"), BorderLayout.WEST);
                    panel.add(new JButton("Exit"), BorderLayout.EAST);

                    removeAll();
                    JPanel inner = new JPanel(new GridBagLayout());
                    inner.add(panel);
                    add(inner);
                    revalidate();
                    repaint();
                }
            });
            JPanel inner = new JPanel(new GridBagLayout());
            inner.add(gameOver);
            add(inner);
        }

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

    }

}