Java 如何使jframe中的jpanel可见

Java 如何使jframe中的jpanel可见,java,swing,user-interface,jframe,jpanel,Java,Swing,User Interface,Jframe,Jpanel,我试着用Java编写一个小游戏的菜单。我认为最好有一个窗口类(扩展JFrame),然后为不同的屏幕(Menue、Game、GameOver等)添加一个JPanel 如果我把按钮和东西直接放在JFrame中,一切都是正确的,但是当我试图把一个JPanel放在JFrame中时,它不起作用。代码如下: public class Window extends JFrame{ private final int WIDTH = 800; private final int HE

我试着用Java编写一个小游戏的菜单。我认为最好有一个窗口类(扩展JFrame),然后为不同的屏幕(Menue、Game、GameOver等)添加一个JPanel 如果我把按钮和东西直接放在JFrame中,一切都是正确的,但是当我试图把一个JPanel放在JFrame中时,它不起作用。代码如下:

   public class Window extends JFrame{



    private final int WIDTH = 800;
    private final int HEIGTH = 600;
    private final int QUADRAT = 50;

    JButton startButton;
    JButton exitButton;
    JButton anleitungButton;
    JLabel gameTitle;

    public Window() {
        super("Study Run");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(null);
        setSize(WIDTH, HEIGTH);
        setResizable(false);
        getContentPane().add(new MenuePanel());
        setVisible(true);
        setLocationRelativeTo(null);

    }
这是我的小组:

public class MenuePanel extends JPanel{

JButton startButton;
JButton exitButton;
JButton anleitungButton;
JLabel gameTitle;


public MenuePanel() {
    super();
    setBackground(Color.CYAN);

    gameTitle = new JLabel("StudyRun", SwingConstants.CENTER);
    gameTitle.setBounds(200, 25, 400, 75);
    gameTitle.setFont(new Font("Arial", Font.ITALIC, 36));
    add(gameTitle);

    startButton = new JButton("start");
    startButton.setBounds(325, 125, 150, 50);
    add(startButton);
    anleitungButton = new JButton("anleitung");
    anleitungButton.setBounds(325, 200, 150, 50);
    add(anleitungButton);
    exitButton = new JButton("exit");
    exitButton.setBounds(325, 450, 150, 50);
    add(exitButton);

    CloseListener closeListener = new CloseListener();
    StartListener startListener = new StartListener();
    AnleitungListener anleitungListener = new AnleitungListener();
    startButton.addActionListener(startListener);
    anleitungButton.addActionListener(anleitungListener);
    exitButton.addActionListener(closeListener);
}
我在网上找到的唯一帮助是,我需要在设置框架可见之前添加面板。那没用。将pack()或revalidate()放在代码中的任何位置也不起作用。另外,将面板设置为不透明或可见也没有任何作用。我不知道还能尝试什么

您的问题在于:

setLayout(null);
当您使用空布局时,编码器完全负责所有添加组件的位置和大小。添加的组件没有大小,因此默认为0,0

一个(糟糕的)解决方案:给菜单面板一个大小或边界

一个更好的解决方案:学习和使用布局管理器(正如您所有的搜索都明确告诉您的那样)。

您的问题在于:

setLayout(null);
当您使用空布局时,编码器完全负责所有添加组件的位置和大小。添加的组件没有大小,因此默认为0,0

一个(糟糕的)解决方案:给菜单面板一个大小或边界


更好的解决方案是:学习和使用布局管理器(正如所有搜索都明确告诉您的那样)。

最好记住Java使用Flowlayout()作为默认设置

 public Window() {

    setLayout(new FlowLayout());
}
因此,正如前面的答案所解释的,您基本上会将布局覆盖为null。此外,如果您计划使用不同的类和面板从不同的类添加到JFrame,请使用getter

class SomePanel{
public JComponent getPanel(){
return panel;
 }
}
然后添加到JFrame

class MyFrame{
add(new SomePanel().getPanel());

}

最好记住,Java使用Flowlayout()作为默认值

 public Window() {

    setLayout(new FlowLayout());
}
因此,正如前面的答案所解释的,您基本上会将布局覆盖为null。此外,如果您计划使用不同的类和面板从不同的类添加到JFrame,请使用getter

class SomePanel{
public JComponent getPanel(){
return panel;
 }
}
然后添加到JFrame

class MyFrame{
add(new SomePanel().getPanel());

}

非常感谢。既然我有几种不同的屏幕类型,BorderLayout会是最好的吗?我的MeUE中间有3个垂直对齐的按钮,游戏只是GAMPANEL,游戏界面在底部有按钮,中间有文本。通常,您会嵌套JPanel,每个都使用自己的布局管理器,以便简单地实现复杂的布局。学习教程。@N00bine:我的主要JPanel也有90%的时间使用它BorderLayout@N00bine:另外,如果您需要交换JPanel,请使用CardLayout(如在屏幕上显示游戏)进行交换。非常感谢。既然我有几种不同的屏幕类型,BorderLayout会是最好的吗?我的MeUE中间有3个垂直对齐的按钮,游戏只是GAMPANEL,游戏界面在底部有按钮,中间有文本。通常,您会嵌套JPanel,每个都使用自己的布局管理器,以便简单地实现复杂的布局。学习教程。@N00bine:我的主要JPanel也有90%的时间使用它BorderLayout@N00bine:此外,如果您需要交换JPanel,请使用CardLayout(如在屏幕上显示游戏)进行交换。