[英]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編碼的靈活性。
其他獨立且無關的問題:
簡而言之,您應該嘗試使用jLayeredPane和多個jPanels,而不是多個框架。 如果您使用的是Netbeans,請在以下位置查看我的GUI制作指南: http : //philofjava.webstarts.com/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.