当前位置: 首页 > 知识库问答 >
问题:

Java fxml从表单返回值

云啸
2023-03-14

我遇到了一个问题,似乎无法使用fxml从javafx中的新表单返回值。

我试图有一个主要的形式,它有4个功能,与游戏的连接4开始游戏,查看玩家,查看游戏,查看玩家游戏

当我启动程序时,会弹出主菜单,然后我想单击“开始游戏”按钮。打开后,将提示输入用户1的信息。然后弹出一个关于玩家信息的新表单。

我遇到的问题是,单击accept按钮后,类中的变量变为null,我尝试通过instance get方法从主菜单类访问,并返回到主类。

在ShowAndWait行之后,变量似乎被清空了。如何在winodow之后检索变量信息(以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>

共有1个答案

宰父俊彦
2023-03-14

在上调用的PersonInfo实例不是与PlayerInfo一起使用的实例。fxml<如果提供了fx:controller属性,则code>fxmloader创建控制器类的新实例。要访问此实例,请在调用load()后使用FXMLLoader'sgetController方法。

例如,您可以创建一个静态方法加载并使用它来创建控制器:

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

或者,您可以使用

 类似资料:
  • 类从REST API接收表示下面JSON内容的。 目标是从这个返回一个来构建一个。 这是发布的JSON: 这是我的代码: 问题:我不确定我的方法是否正确。到目前为止,输出只显示JSON的第一个和最后一个花括号: 有没有其他方法可以从文件部分的字节中获得正确的?或者,创建JSONObject的方法可能是问题所在? 非常感谢您的提前点子!

  • 这是我的登录页面: "这是表单,表单action="设置为无(可能是问题?) 第二页 每当我点击“登录”按钮时,表单就会返回,而不是页面重定向我。。请帮忙, 提前谢谢

  • 问题内容: 我们有一个表格,其形式为: 我们需要将其转化为。 是否有一个聪明的方法可以在一个SELECT语句中执行此操作(即不使用UNION)?列名称Value1,Value2和Value3是固定的且恒定的。 该数据库是oracle 9i。 问题答案: 这适用于Oracle 10g: 我认为Oracle 9i有递归查询吗?无论如何,我非常确定它具有CASE支持,因此即使它没有递归查询,也可以执行“

  • 问题内容: 提交表单时,我正在运行此表单检查: 该脚本有效,如果数据== 1,它会警告键已经存在,但是表单仍在提交。我以为如果data == 1则返回false将停止处理表单,但是无论如何它都会继续并添加键,并且弹出键已经存在。如果data == 1,如何阻止表单提交?我什至尝试这样做: 然后删除脚本底部的return true,但是会发生相同的问题。弹出窗口出现,但表单仍得到处理。 问题答案:

  • 我的数据库中有两个表: 表1:购买物品 表1列出了购买的物品,表2每小时更新一次每件物品的当前价格。因此,从表2中可以清楚地看出,肉类最后一次交易是在2013年2月20日上午10点,而鱼类不是在同一天交易的,它是在2013年2月19日上午9点交易的,鸡肉是在2013年2月20日上午9点交易的。我想做的是,列出表1中的所有项目,并加入表2中各个项目的最后交易价格,如下所示: 这里应该应用什么类型的连

  • 问题内容: 我使用asp.net和网络表单。在我的项目中,我有asmx Web服务 结果就是这种格式。 如何在$ .ajax成功中附加此结果标签以获取此输出: 1-测试1,2-测试2。 问题答案: 而是返回列表,并使用[ScriptMethod(ResponseFormat = ResponseFormat.Json)]属性- 它将自动创建JSON对象作为返回: 在JS方面: