java - Java fxml从表单返回值
问题描述
我遇到了一个问题,我似乎无法使用 fxml 从 javafx 中的新表单返回值。
我正在尝试拥有一个主窗体,它具有与连接 4 开始游戏、查看玩家、查看游戏、查看玩家游戏的游戏相关的 4 个功能
当我启动程序时,会弹出主菜单,然后我想点击“开始游戏”按钮。之后打开它会提示输入用户 1 的信息。然后它会弹出一个关于玩家信息的新表单。
我遇到的问题是,在单击接受按钮后,类中的变量变为 null 我尝试通过实例获取方法从主菜单类访问并返回主类。
在 ShowAndWait 行之后,变量似乎被清空了。如何在 windows 之后检索变量信息(以 c# 方式)
package Homework_5;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
import java.util.ArrayList;
public class Connect4Window extends Application {
ArrayList<Connect4Game> games = new ArrayList<>();
public static void main(String[] args) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception{
Parent root = FXMLLoader.load(getClass().getResource("FXML_Files/MainMenu.fxml"));
primaryStage.setTitle("Connect 4");
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
}
主菜单类
package Homework_5.FXML_Java_Classes;
import Homework_5.DataClasses.PersonData;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Alert;
import javafx.scene.control.Button;
public class MainMenu {
@FXML
private Button btnViewGames;
@FXML
private Button btnViewPlayers;
@FXML
private Button btnStartGame;
@FXML
private Button btnViewPlayerGames;
@FXML
void startGame(ActionEvent event) {
Alert alert = new Alert(Alert.AlertType.NONE, "Please enter player 1 info");
alert.setHeaderText(null);
alert.setTitle("Player 1 info");
alert.showAndWait();
PlayerInfo playerInfo = new PlayerInfo();
playerInfo.Show();
System.out.println(playerInfo.getTxtName()); //Shows null
System.out.println(playerInfo.isInfoAccepted()); //Shows null
System.out.println(playerInfo.getChkComputer()); //Shows null
System.out.println(playerInfo.getColor()); //Shows null
}
@FXML
void viewPlayers(ActionEvent event) {
System.out.println("view players");
}
@FXML
void viewPlayerGames(ActionEvent event) {
System.out.println("view playergames");
}
@FXML
void viewGames(ActionEvent event) {
System.out.println("view games");
}
}
玩家信息类
package Homework_5.FXML_Java_Classes;
import Homework_5.DataClasses.PersonData;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.paint.Color;
import javafx.stage.Modality;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
public class PlayerInfo {
@FXML
private Button btnAccept;
@FXML
private ColorPicker colorColorPicker;
@FXML
private CheckBox chkComputer;
@FXML
private TextField txtName;
@FXML
private Button btnClear;
private boolean infoAccepted = false;
public PlayerInfo(){
}
public PersonData Show()
{
try{
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../FXML_Files/PlayerInfo.fxml"));
Parent root1 = fxmlLoader.load();
Stage stage = new Stage();
stage.initModality(Modality.WINDOW_MODAL);
stage.setTitle("Enter Player Information");
stage.setScene(new Scene(root1));
stage.showAndWait();
return new PersonData(txtName.getText(), colorColorPicker.getValue(), chkComputer.isSelected());
} catch (Exception e)
{
e.printStackTrace();
}
return null;
}
@FXML
void Accept(ActionEvent event) {
if (txtName.getText().isEmpty()) {
Alert alert = new Alert(Alert.AlertType.WARNING, "The name field is blank!\n\nPlease enter a name.");
alert.setHeaderText(null);
alert.setTitle("Name Blank");
alert.showAndWait();
} else {
infoAccepted = true;
Stage stage = (Stage) btnAccept.getScene().getWindow();
stage.close();
}
}
@FXML
void Clear(ActionEvent event) {
txtName.clear();
colorColorPicker.setValue(Color.WHITE);
chkComputer.setSelected(false);
}
public Color getColor() {
return colorColorPicker.getValue();
}
public boolean getChkComputer() {
return chkComputer.isSelected();
}
public String getTxtName() {
return txtName.getText();
}
public boolean isInfoAccepted() {
return infoAccepted;
}
}
主菜单 fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.*?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane prefHeight="81.0" prefWidth="442.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Homework_5.FXML_Java_Classes.MainMenu">
<children>
<Button fx:id="btnStartGame" layoutX="14.0" layoutY="14.0" mnemonicParsing="false" onAction="#startGame" prefHeight="55.0" prefWidth="86.0" text="Start Game" />
<Button fx:id="btnViewPlayers" layoutX="110.0" layoutY="14.0" mnemonicParsing="false" onAction="#viewPlayers" prefHeight="55.0" prefWidth="86.0" text="View Players" />
<Button fx:id="btnViewPlayerGames" layoutX="302.0" layoutY="14.0" mnemonicParsing="false" onAction="#viewPlayerGames" prefHeight="55.0" prefWidth="127.0" text="View Player Games" />
<Button fx:id="btnViewGames" layoutX="206.0" layoutY="14.0" mnemonicParsing="false" onAction="#viewGames" prefHeight="55.0" prefWidth="86.0" text="View Games" />
</children>
</AnchorPane>
播放器信息 fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.scene.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<AnchorPane prefHeight="201.0" prefWidth="213.0" rotate="-0.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Homework_5.FXML_Java_Classes.PlayerInfo">
<children>
<Button fx:id="btnAccept" cancelButton="true" layoutX="14.0" layoutY="165.0" mnemonicParsing="false" onAction="#Accept" text="Accept" />
<Button fx:id="btnClear" layoutX="156.0" layoutY="165.0" mnemonicParsing="false" onAction="#Clear" text="Clear" />
<CheckBox fx:id="chkComputer" layoutX="57.0" layoutY="126.0" mnemonicParsing="false" text="Computer" />
<ColorPicker fx:id="colorColorPicker" layoutX="57.0" layoutY="81.0" />
<TextField fx:id="txtName" layoutX="57.0" layoutY="41.0" />
<Label contentDisplay="CENTER" layoutX="14.0" layoutY="14.0" text="Please Enter User Information below" />
<Label layoutX="14.0" layoutY="45.0" text="Name:" />
<Label layoutX="14.0" layoutY="85.0" text="Color:" />
</children>
</AnchorPane>
解决方案
您调用的PersonInfo
实例Show()
不是与PlayerInfo.fxml
. 如果提供了属性FXMLLoader
,则创建控制器类的新实例。fx:controller
要访问此实例,请在调用 后使用FXMLLoader
'方法。getController
load()
例如,您可以创建一个static
加载方法并使用它来创建控制器:
public class PlayerInfo {
@FXML
private Parent root1;
public static PlayerInfo create() throws Exception {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("../FXML_Files/PlayerInfo.fxml"));
fxmlLoader.load();
return fxmlLoader.getController();
}
public PersonData Show() {
Stage stage = new Stage();
stage.initModality(Modality.WINDOW_MODAL);
stage.setTitle("Enter Player Information");
stage.setScene(new Scene(root1));
stage.showAndWait();
return new PersonData(txtName.getText(), colorColorPicker.getValue(), chkComputer.isSelected());
}
...
}
<AnchorPane fx:id="root1" prefHeight="201.0" prefWidth="213.0" rotate="-0.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="Homework_5.FXML_Java_Classes.PlayerInfo">
...
PlayerInfo playerInfo = PlayerInfo.create();
playerInfo.Show();
推荐阅读
- python - Scipy 的优化曲线拟合问题
- html - CSS 边框图像关键帧动画在 Firefox 中有效,但在 Chrome 中无效
- javascript - 仅当变量值不为空/未定义/空时才显示 html 电子邮件模板元素
- reactjs - 在 VSCode 中反应显示拼写错误的组件
- swift - xCode 12.5 swift 5.4 类型推断问题,未使用结果
- qtablewidget - 将某些字段限制为数字数据输入
- spring - 引起:java.lang.NoSuchMethodError: 'java.lang.String javax.servlet.ServletContext.getVirtualServerName()'
- c++ - 我不明白我是如何在这里出现超出范围的错误
- django - 我无法阅读我在 Python 的 txt 文件中编写的内容
- python - 不懂 Python lambda 函数语法