簡體   English   中英

如何阻止Swing打開新框架?

[英]How to stop Swing from opening a new frame?

我正在編寫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);

}


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

package guiPackage;

import javax.swing.*;
import java.awt.*;
import java.util.Scanner;

public class CharacterCreator extends StartGame {

JTextField newName;
JPanel creatorScreen;
Scanner scan = new Scanner(System.in);

public CharacterCreator() {

    creatorScreen = new JPanel();
    //creatorScreen.setVisible(true);

    newName = new JTextField("Create a charactor");
    //newName.setLocation(null);

    screen.add(creatorScreen);
    creatorScreen.add(newName);
}
public String setCharacterName(){
    String characterName = "";
    return characterName;
}
}

Java是否應該具有這樣的功能?

您的代碼只會執行您要告訴的內容,並且您的代碼中存在多個問題,其中包括一個問題:

public class CharacterCreator extends StartGame {

您通過繼承StartGame的CharacterCreator類來濫用繼承。 您似乎正在執行此操作以允許類之間進行通信,但這不是繼承的目的,並且在執行此操作時,您的子類正在調用父類的構造函數,從而創建了比您想要或需要的窗口更多的窗口。 解決方案是在此處使用繼承,而是將引用傳遞到需要它們的位置。

還請檢查使用多個JFrame,良好/不良做法? 因為您的應用程序應該只有一個主應用程序窗口或JFrame。 任何子窗口都應該是JDialogs,而不是JFrames。

另一個問題:StartGame擴展了JFrame,並且還包含一個JFrame變量-太多的JFrame,最好擺脫一個或另一個。 通常,您不想創建擴展頂級窗口的類,因為您會發現自己通過擴展類JFrame來使自己處於角落,從而在需要更多靈活性時強制您創建和顯示JFrame。 實際上,我會冒險地說,我創建的大多數Swing GUI代碼都不會擴展JFrame,實際上,很少有人願意這樣做。 更常見的是,您的GUI類將面向創建JPanels,然后將其放置到JFrames或JDialogs或JTabbedPanes中,或者在需要時通過CardLayouts進行交換。 這將大大增加GUI編碼的靈活性。

其他獨立且無關的問題:

  • 您似乎正在將事件驅動的GUI與控制台GUI組合在一起,因為您使用的是由System.in初始化的Scanner對象。 這不是一個好主意,因為這兩個編程范例很難輕松地相互配合,而是最好堅持使用線性控制台程序或事件驅動的GUI來彼此兼容。

簡而言之,您應該嘗試使用jLayeredPane和多個jPanels,而不是多個框架。 如果您使用的是Netbeans,請在以下位置查看我的GUI制作指南: http//philofjava.webstarts.com/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM