如何阻止Swing打开新框架?

我正在编写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);


}



凤凰求蛊
浏览 176回答 2
2回答

一只名叫tom的猫

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来彼此兼容。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java