我基本上一直在尝试通过使用JFrame并切换出2个JPanels(一个用于菜单,一个用于实际游戏)来制作游戏菜单。我正在尝试实现我能想到的最基本的格式,但似乎无法使其正常工作。如果有人可以解释代码有什么问题,我将不胜感激。

这是我的JFrame,菜单面板和ActionListener

package buttonMenu;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Skeleton extends JFrame implements ActionListener{

JPanel menu;
JButton button;

public Skeleton(){

setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 400);
setVisible(true);

menu = new JPanel();
button = new JButton("button");

menu.setSize(400, 400);
menu.setBackground(Color.BLACK);
menu.setVisible(true);
menu.add(button);

button.setLocation(200, 200);
button.addActionListener(this);

add(menu, BorderLayout.CENTER);

}

public void actionPerformed(ActionEvent a){
    JPanel panel = Game.Game();
    this.remove(menu);
    this.add(panel);
}

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


actionPerformed调用在此类中创建的面板

package buttonMenu;
import java.awt.Color;
import javax.swing.JPanel;
public class Game{

public static JPanel Game(){
    JPanel panel = new JPanel();
    panel.setSize(400, 400);
    panel.setBackground(Color.WHITE);
    return panel;
}

}


同样,如果有人可以向我解释这段代码有什么问题,我将不胜感激。谢谢

最佳答案

添加/删除组件时,您将需要revalidate父容器以强制其自行中继...

public void actionPerformed(ActionEvent a){
    JPanel panel = Game.Game();
    this.remove(menu);
    this.add(panel);
    this.revalidate();
}


更好的解决方案是使用CardLayout之类的东西

查看How to use CardLayout了解更多详细信息

ps-我应该补充。您应该避免直接从JFrame进行扩展,而应在整个基础组件(例如JPanel)上创建应用程序。当需要显示它时,创建一个JFrame实例并向其中添加应用程序组件。这样,您的应用程序在部署和重用方面变得更加灵活

关于java - 在单个JFrame中使用多个JPanel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/17711869/

10-09 03:42