0

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

这是我的 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;       
}

}

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

4

3 回答 3

2

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

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

更好的解决方案是使用类似CardLayout

查看如何使用 CardLayout了解更多详情

ps-我应该补充一下。JFrame您应该避免直接从JPanel. 当您需要显示它时,创建一个 JFrame 实例并将应用程序组件添加到其中。这样,您的应用程序在部署和重用方面变得更加灵活

于 2013-07-17T23:18:08.467 回答
1

我的代码有什么问题可能是一个模糊的问题,但我会整理一些要点:

  • extends JFrame:您并没有真正扩展 JFrame,您只是在使用一个,作为 GUI 的一部分。
  • 正如其他答案所提到的,您应该revalidate()在添加/删除组件之后。
  • menu.setVisible(true),通常这不是必需的。
  • 也许没有,但我通常先构建所有界面(创建和添加初始组件),然后才设置框架的尺寸和可见性。
  • 您正在main线程中运行所有代码;Swing 组件不是线程安全的。有关这方面的更多信息,请参阅Swing 中的并发。
  • 我知道这是为了游戏,但你的面板中真的需要绝对定位吗?如果可能,请使用布局管理器(您的游戏面板除外,它可能只进行自定义绘画)。
于 2013-07-17T23:28:02.557 回答
1

使用 validate() 方法查看更改。

public void actionPerformed(ActionEvent a){
    JPanel panel = Game.Game();
    this.remove(menu);
    this.add(panel);   
    this.validate();
}
于 2013-07-17T23:18:54.753 回答