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

如何在FXML控制器中设置新场景

贺兴昌
2023-03-14

我是一个全新的编程,这两个星期才开始学习,所以我很抱歉任何多余或草率的代码...

主类:

package supportTool;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.*;
import javafx.stage.Stage;

public class Main extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    public String versionNumber = "v2.1";

    @Override
    public void start(Stage primaryStage) throws Exception {
        // SETTING UP THE STAGE
        Stage window;
        window = primaryStage;
        window.setTitle("Support Tool " + versionNumber);
        // SETTING UP THE SCENES
        Parent newCallDetailsFXML = FXMLLoader.load(getClass().getResource("newCallDetails.fxml"));
        Parent mainCallWindowFXML = FXMLLoader.load(getClass().getResource("mainCallWindow.fxml"));
        Scene newCallDetails = new Scene (newCallDetailsFXML, 800, 600);
        Scene mainCallWindow = new Scene (mainCallWindowFXML, 800, 600);
        // CHOOSING THE SCENE AND SHOWING THE STAGE
        window.setScene(newCallDetails);
        window.show();
    }
}

场景1 FXML控制器:

package supportTool;

import javafx.scene.control.*;
import javafx.scene.image.*;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class newCallController {

    private int maxChar;
    public ChoiceBox choiceAccount;
    public ImageView btnCall;
    public TextField tfCallbackNumber;
    public TextField tfCallerName;
    public TextField tfStoreNumber;

    // ACTION COMPLETED WHEN CALL BUTTON IS PRESSED
    public void btnCall() {
        Caller newCaller = new Caller();
        newCaller.setCallerName(tfCallerName.getText());
        newCaller.setCallbackNumber(tfCallbackNumber.getText());
        newCaller.setAccount(String.valueOf(choiceAccount.getValue()));
        newCaller.setStoreNumber(tfStoreNumber.getText());
        try {
            FileOutputStream fos = new FileOutputStream("caller.bin");
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            oos.writeObject(newCaller);
            oos.close();
            fos.close();
        } catch(IOException e){
            e.printStackTrace();
        }           
        // RIGHT HERE IS WHERE I WANT TO SET THE SCENE TO "mainCallWindow"
    }

    // CHECKS TO SEE IF THE TEXT CONTAINS ONLY LETTERS
    private boolean isNumberCheckEvent(String message) {
        if (message.matches("[0-9]+")) {
            return true;
        } else {
            return false;
        }
    }

    // SETS THE MAX CHARACTERS FOR ALL TEXTFIELDS
    public void maxCharEvent() {
        // CALLER NAME MAX CHARACTERS
        tfCallerName.setOnKeyTyped(maxCharEvent -> {
            maxChar = 20;
            if(tfCallerName.getText().length() >= maxChar) {
                maxCharEvent.consume();
            }
        });
        // CALLBACK NUMBER MAX CHARACTERS
        tfCallbackNumber.setOnKeyTyped(maxCharEvent -> {
            maxChar = 10;
            if(tfCallbackNumber.getText().length() >= maxChar) {
                maxCharEvent.consume();
            }
        });
        // STORE NUMBER MAX CHARACTERS
        tfStoreNumber.setOnKeyTyped(maxCharEvent -> {
            maxChar = 5;
            if (String.valueOf(choiceAccount.getValue()).equals("6 Digit Account")) {
                maxChar = 6;
            }
            if (tfStoreNumber.getText().length() >= maxChar) {
                maxCharEvent.consume();
            }
        });
    }

    // CHANGES TEXT TO ONLY LETTERS BASED ON isNumberCheckEvent
    public void numberValidationEvent() {
        tfCallbackNumber.setOnKeyReleased(numberValidationEvent -> {
            maxCharEvent();
            if(tfCallbackNumber.getText().length() > 0) {
                if (!isNumberCheckEvent(tfCallbackNumber.getText())) {
                    tfCallbackNumber.setText(tfCallbackNumber.getText().substring(0, tfCallbackNumber.getText().length() - 1));
                    tfCallbackNumber.positionCaret(10);
                    numberValidationEvent.consume();
                }
            }
        });
        tfStoreNumber.setOnKeyReleased(numberValidationEvent -> {
            maxCharEvent();
            if(tfStoreNumber.getText().length() > 0) {
                if (!isNumberCheckEvent(tfStoreNumber.getText())) {
                    tfStoreNumber.setText(tfStoreNumber.getText().substring(0, tfStoreNumber.getText().length() - 1));
                    tfStoreNumber.positionCaret(10);
                    numberValidationEvent.consume();
                }
            }
        });
    }
}

共有1个答案

尉迟默
2023-03-14

你可以用各种方法改变场景。在您当前的情况下,您可以尝试以下内容。首先,您需要对FXMLLoader、场景和阶段的引用,以便从控制器中更改场景。不是在main类中加载,而是在controller类中加载。

   FXMLLoader loader = new FXMLLoader(getClass().getResource("mainCallWindow.fxml"));
   Parent mainCallWindowFXML = loader.load();

   //use one of components on your scene to get a reference to your scene object.

   Stage stage = (Stage)tfCallerName.getScene.getWindow();//or use any other component in your controller
   Scene mainCallWindow = new Scene (mainCallWindowFXML, 800, 600);
   stage.setScene(newCallDetails);
   stage.show(); //this line may be unnecessary since you are using the same stage.
}

这并不是实现这一点的唯一途径。您可以使用同一场景加载不同的FXML文件。我会建议改变场景的根节点,而不是完全改变场景。

 类似资料:
  • 我尝试加载一个FXML,并使用Java代码(而不是使用FXML标记)设置控制器。我在FXML中有不同的字段。我尝试加载(例如文本字段、按钮...)。 下面是一个例子: 如您所见,我创建了一个新的选项卡,为它设置文本,将它添加到tabpane,加载fxml,然后创建一个新的控制器,并将其设置为fxml的控制器。之后,我尝试在初始化之前在fxml中设置一个值,以便在控制器中使用它来更新文本字段或按钮。

  • 问题内容: 当我在JavaFX中调用FXMLLoader#load()时会发生什么? 假设FXML控制器扩展了具有构造函数的类。是否可以保证构造函数将被调用?如果没有,将如何创建该对象的新实例?例如,在下面的代码中,是否将调用TextField()构造函数? 我已经尝试过搜索这个,但是除了“从FXML文档中加载对象层次结构”之外,似乎没有关于它的文档。来自http://docs.oracle.co

  • 我已经试着搜索了这篇文章,但是除了“从FXML文档加载对象层次结构”之外,似乎没有关于它的文档。摘自http://docs.oracle.com/javafx/2/api/javafx/fxml/fxmlloader.html 你的回答将不胜感激。多谢!

  • 问题内容: 我试图在JavaFX中获得TableView来动态显示内容。 当我运行程序时,出现此错误: 我的控制器名为“ UserInterfaceController.java”,它与FXML文件位于同一软件包下,我也已将该软件包导入了FXML中。为什么找不到控制器? FXML文件: 控制器: 主类: 问题答案: 使用FXML的全限定名来引用您的控制器: 后续问题的答案 对以下问题的回答解释了为

  • 我试图在JavaFX中获得一个TableView来动态显示内容。 当我运行程序时,出现以下错误: 我的控制器名为“UserInterfaceController.java”,它与FXML文件在同一个包下,我也在FXML中导入了包。为什么找不到控制器? FXML文件: 控制器: 主要类:

  • 但我怎么能这样做呢?fxml文件必须放在主目录文件夹还是资源文件夹的哪个位置?如果我使用场景构建器改变一个的数据,另一个也会改变吗?我需要在porn.xml中添加这个maven resources插件吗?下面是一些照片: 主体工程 在尝试fx:controller之前,将资源文件夹中的balanceus.fxml Github 感谢任何帮助,也为我的英语(不是我的第一语言)的糟糕感到抱歉。