为了账号安全,请及时绑定邮箱和手机立即绑定

如何阻止Swing打开新框架?

如何阻止Swing打开新框架?

凤凰求蛊 2021-05-07 14:13:29
我正在编写Java文本冒险游戏,并使用Java Swing作为在游戏屏幕上显示简单用户GUI的一种方式。我想要三个不同的窗口,一个作为开始屏幕,一个用于角色创建屏幕,用户在其中输入名称和一些属性,以及一个实际进行游戏的窗口。我想在一个单独的类中编写每个屏幕,以增加代码的组织性和可读性。但是,每当我单击JButton转到下一个屏幕时,就会JFrame打开一个全新的内容。如何编写GUI,以便所有屏幕更改都在一帧之内完成?Java是否应该具有这样的功能?我已经浏览了至少几十个Java Swing论坛问题,但仍然无法找出我在Java swing实现中做错了什么。package guiPackage;import javax.swing.*;import thingsPackage.Player;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class StartGame extends JFrame {JFrame Game;JPanel buttonMenu, screen;JButton newGame, settings, exit, loadGame;    public StartGame() {    Game = new JFrame();    Game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        Game.setVisible(true);    Game.setSize(750, 750);    Game.setLocationRelativeTo(null);    screen = new JPanel();    screen.setVisible(true);    TitleScreenHandler ts = new TitleScreenHandler();    buttonMenu = new JPanel();    newGame = new JButton("New Game");    newGame.addActionListener(ts);    loadGame = new JButton("LoadGame");    loadGame.addActionListener(ts);    settings = new JButton("Settings");    settings.addActionListener(ts);    exit = new JButton("Exit");    exit.addActionListener(ts);    Game.add(screen);    screen.add(buttonMenu, BorderLayout.SOUTH);    buttonMenu.add(newGame);    buttonMenu.add(loadGame);    buttonMenu.add(settings);    buttonMenu.add(exit);}
查看完整描述

2 回答

?
一只名叫tom的猫

TA贡献1906条经验 获得超3个赞

Java是否应该具有这样的功能?

您的代码只会执行您要告诉的内容,并且您的代码中有几个问题,其中包括一个问题:

public class CharacterCreator extends StartGame {

您通过继承StartGame的CharacterCreator类来滥用继承。您似乎正在执行此操作以允许类之间进行通信,但这不是继承的目的,并且在执行此操作时,您的子类正在调用父类的构造函数,从而创建了比您想要或需要的窗口更多的窗口。解决方案是在此处使用继承,而是将引用传递到需要它们的位置。

还请检查使用多个JFrame,良好/不良做法?因为您的应用程序应该只有一个主应用程序窗口或JFrame。任何子窗口都应该是JDialogs,而不是JFrames。

另一个问题:StartGame扩展了JFrame,并且还包含一个JFrame变量-太多的JFrame,最好摆脱一个或另一个。通常,您不希望创建扩展顶级窗口的类,因为您会发现自己通过扩展类JFrame来使自己处于角落,从而在需要更多灵活性时强制您创建和显示JFrames。实际上,我敢冒险发现我创建的大多数Swing GUI代码都不会扩展JFrame,实际上,很少有人愿意这样做。更常见的是,您的GUI类将面向创建JPanels,然后将其放置到JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts进行交换。这将大大增加您的GUI编码的灵活性。

其他独立且无关的问题:

  • 您似乎正在将事件驱动的GUI与控制台GUI组合在一起,因为您使用的是由System.in初始化的Scanner对象。这不是一个好主意,因为这两种编程范例很难轻松地相互配合,而是最好坚持使用线性控制台程序或事件驱动的GUI来彼此兼容。


查看完整回答
反对 回复 2021-05-19
  • 2 回答
  • 0 关注
  • 175 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信