当前位置: 首页 > 知识库问答 >
问题:

在单个JFrame中使用多个JPanel

司马祖鹤
2023-03-14

我基本上一直在尝试通过使用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;       
}

}

同样,如果有人能向我解释一下这段代码的错误,我将不胜感激。谢谢

共有3个答案

司徒俊雄
2023-03-14

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

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

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

public void actionPerformed(ActionEvent a){
    JPanel panel = Game.Game();
    this.remove(menu);
    this.add(panel);   
    this.validate();
}
盖弘毅
2023-03-14

添加/删除组件时,您需要对父容器进行重新验证,以强制它将自身中继出去。。。

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

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

查看如何使用CardLayout了解更多详细信息

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

 类似资料:
  • 我有两件事情要做:在鼠标悬停时突出显示JPanel,在鼠标拖动时移动一个蓝色方块。问题是,这需要我将MouseListeners添加到不同的组件中。当我这样做时,我只能使用一个功能——另一个被阻止了。我该怎么做才能让两个功能都工作? 注意:有时候JFrame不会显示任何东西——你只需要一直运行它,直到它显示为止(通常需要2-3次尝试)。如果它做了任何其他奇怪的事情,就继续运行它,直到它工作。如果之

  • 我有3个不同的JFrames。一个是一个登录页面,另一个有,第三个是主页。现在我想要的是,当我们登录时,我想在登录页面上方显示,并在完成进度到100%时,我想关闭两个框架并打开第三个,这是主页。请好心帮我完成这项工作。谢谢//这是代码部分。 }//这打开我的进度条的第二个JFrame //在Progressbar页面的下一页,我有这个代码 //现在我想要的是,在进度条完成后,我想处理登录页面和只打

  • 问题内容: 我正在开发一个应用程序,该程序将管理注册课程的学生。该应用程序将具有可以登录并操纵学生的用户。用户还可以对学生进行评论。因此,我们的三个主要班级是学生,用户和评论。问题是我需要将个人评论与其他两个模型相关联:用户和学生。所以我从这样的一些基本代码开始… 因此,在注释表中,单个记录将具有以下字段: 这带来了几个问题。首先,用于创建关联对象的漂亮的Rails语法会分解。如果要发表新评论,则

  • 问题内容: 我下棋。我写了3节课。如果是游戏则为第一。(棋盘,棋子等),另外一个用于菜单。(新,打开,设置时间等按钮) 他们两个都使用JFrame。 我想将上述两个类都放在第3类中。例如,“游戏”窗口在左侧,菜单在右侧。第三类还将通过JFrame显示整个应用程序。 怎么做? 问题答案: 您不能将一个JFrame放入另一个。您在这里有几个设计选择。您可以将JFrames更改为JPanels。这可能是

  • 我希望来自两个不同类的两个图像并排扩展JPanel。 我遇到的问题是两个JPanel应该在JFrame内部,但是当我做framename.add(panel)时,它会替换另一个,而不是并排添加其中两个。 我尝试在主类中添加flowlayout和其他布局,但是没有一个图像显示出来。 所以我的问题是,如果我有两个扩展Jpanel的类,我如何在Jframe中添加这两个面板,以便它们并排(彼此相邻)而不替

  • 问题内容: 我正在尝试在站点中创建搜索功能,并且希望用户能够搜索多个单词,并根据各种模型中存在的条件执行子字符串匹配。 为了这个示例,假设我有以下模型: 员工 公司 市政府 县 一个县有多个直辖市,有多个公司,有多个员工。 我希望搜索能够针对Employee.firstname,Employee.lastname,Company.name,Municipality.name和County.name