Java 如何阻止Swing打开新框架?

Java 如何阻止Swing打开新框架?,java,swing,user-interface,jframe,Java,Swing,User Interface,Jframe,我正在编写一个Java文本冒险,并使用JavaSwing作为一种方式来显示一个简单的用户GUI作为游戏屏幕。我想有三个不同的窗口,一个作为开始屏幕,一个用于角色创建屏幕,用户在其中输入名称和一些属性,还有一个是游戏实际发生的地方 我想在一个单独的类中编写每个屏幕,以提高代码的组织性和可读性。然而,每当我点击JButton进入下一个屏幕时,一个全新的JFrame就会打开,其中包含内容。如何编写GUI,使所有屏幕更改都在一个框架内发生?Java应该像这样工作吗 我已经浏览了至少几十个JavaSwin

我正在编写一个Java文本冒险,并使用JavaSwing作为一种方式来显示一个简单的用户GUI作为游戏屏幕。我想有三个不同的窗口,一个作为开始屏幕,一个用于角色创建屏幕,用户在其中输入名称和一些属性,还有一个是游戏实际发生的地方

我想在一个单独的类中编写每个屏幕,以提高代码的组织性和可读性。然而,每当我点击
JButton
进入下一个屏幕时,一个全新的
JFrame
就会打开,其中包含内容。如何编写GUI,使所有屏幕更改都在一个框架内发生?Java应该像这样工作吗

我已经浏览了至少几十个JavaSwing论坛问题,但仍然无法找出我的JavaSwing实现的错误

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);

}


public class TitleScreenHandler implements ActionListener{
    public void actionPerformed(ActionEvent titleScreenEvent) {

        if (titleScreenEvent.getSource() == newGame) {
            buttonMenu.setVisible(false);
            CharacterCreator newCharacter = new CharacterCreator();

        }
        else if (titleScreenEvent.getSource() == loadGame) {
            buttonMenu.setVisible(false);
        }
        else if (titleScreenEvent.getSource() == settings) {
            buttonMenu.setVisible(false);

        }
        else if (titleScreenEvent.getSource() == exit){
            System.out.println("goodbye");
            System.exit(0);
        }
    }
}
}

Java应该像这样工作吗

您的代码只执行您告诉它的操作,您的代码中有几个问题,其中包括一个问题:

public class CharacterCreator extends StartGame {
您将CharacterCreator类从StartName扩展,这是在滥用继承。您这样做似乎是为了允许类之间的通信,但这不是继承的目的,在这样做的过程中,您的子类正在调用父类的构造函数,创建了比您想要或需要的更多的窗口。解决方案是在这里不使用继承,而是将引用传递到需要它们的地方

另外,请检查,因为您的应用程序应该只有一个主应用程序窗口或JFrame。任何子窗口都应该是JDialogs,而不是JFrames

另一个问题:StartName扩展了JFrame,还保存了一个JFrame变量——JFrame太多,最好去掉其中一个。通常情况下,您不希望创建扩展顶级窗口的类,因为您会发现让类扩展JFrame会让自己陷入困境,迫使您创建和显示JFrame,而这通常需要更大的灵活性。事实上,我敢说,我创建的大多数Swing GUI代码和我看到的大多数Swing GUI代码都没有扩展JFrame,事实上,很少有人愿意这样做。更常见的是,您的GUI类将面向创建JPanel,然后可以将JPanel放入JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts进行交换。这将大大提高GUI编码的灵活性

其他独立和无关的问题:

  • 您似乎将事件驱动GUI与控制台GUI相结合,因为您使用的是由System.in启动的扫描仪对象。这不是一个好主意,因为这两种编程范例并不容易相互配合,相反,最好坚持使用其中一种,线性控制台程序或事件驱动GUI
Java应该像这样工作吗

您的代码只执行您告诉它的操作,您的代码中有几个问题,其中包括一个问题:

public class CharacterCreator extends StartGame {
您将CharacterCreator类从StartName扩展,这是在滥用继承。您这样做似乎是为了允许类之间的通信,但这不是继承的目的,在这样做的过程中,您的子类正在调用父类的构造函数,创建了比您想要或需要的更多的窗口。解决方案是在这里不使用继承,而是将引用传递到需要它们的地方

另外,请检查,因为您的应用程序应该只有一个主应用程序窗口或JFrame。任何子窗口都应该是JDialogs,而不是JFrames

另一个问题:StartName扩展了JFrame,还保存了一个JFrame变量——JFrame太多,最好去掉其中一个。通常情况下,您不希望创建扩展顶级窗口的类,因为您会发现让类扩展JFrame会让自己陷入困境,迫使您创建和显示JFrame,而这通常需要更大的灵活性。事实上,我敢说,我创建的大多数Swing GUI代码和我看到的大多数Swing GUI代码都没有扩展JFrame,事实上,很少有人愿意这样做。更常见的是,您的GUI类将面向创建JPanel,然后可以将JPanel放入JFrames或JDialogs或JTabbedPanes中,或者在需要时通过CardLayouts进行交换。这将大大提高GUI编码的灵活性

其他独立和无关的问题:

  • 您似乎将事件驱动GUI与控制台GUI相结合,因为您使用的是由System.in启动的扫描仪对象。这不是一个好主意,因为这两种编程范例并不容易相互配合,相反,最好坚持使用其中一种,线性控制台程序或事件驱动GUI

简而言之,您应该尝试使用jLayeredPane和多个JPanel,而不是多个帧。如果您使用的是Netbeans,请查看我的GUI制作指南:

简而言之,您应该尝试使用jLayeredPane和多个JPanel,而不是多个框架。如果您正在使用Netbeans,请查看我的GUI制作指南:

:D非常感谢您提供的这一点信息。我一直在琢磨如何让它发挥作用。我非常欣赏如何正确使用swing组件的课程。:D非常感谢您提供的这一点信息。我一直在琢磨如何让它发挥作用。我非常欣赏如何正确使用swing组件的课程。