【问题标题】:Calling a method with parameters in javafx´s scenebuilder在 javafx 的场景构建器中调用带有参数的方法
【发布时间】:2019-06-15 00:29:25
【问题描述】:

我两周前开始编码,我正在尝试 java higgledy-piggledy。

我编写了一个 Java 斐波那契数列程序,它可以让您选择数列的起点和长度。

我使用代码构建了我的第一个 JavaFx Gui,但随后更改为 SceneBuilder。

从那时起,我试图在 sample.fxml 和 Controller.java 中实现我的代码。我想出了如何调用方法并将它们与我的 gui 与场景构建器链接,但我不太清楚如何调用带参数的方法,比如我的斐波那契方法。

对不起,这是我的第一个问题。不要因为我犯错而恨我。 谢谢指教。

这对我的手工编码 gui 非常有效,因为我可以在对象上使用我的方法并使用该方法调用触发事件。

Google 是我的朋友,但我还找不到关于这个主题的任何解决方案。

我正在考虑在我的代码中使用声明的变量而不是参数,然后使用 setter 调用它们,但我不知道如何在 Scene Builder 中实现它。

i only can link methods without parameters (events work) (

void fibonacci(int start, int length) { 

            while (i <= start) {  (not everything due to understainding)
       //the syntax of my method in "original" javafx getting called by


        if (actionEvent.getSource() == sub_button) {
            FibMain fibMain = new FibMain();
            while (true) {


                try {
                    length = Integer.parseInt(fib_length.getText());    

                    start = Integer.parseInt(fib_start.getText());
                    break;
                } catch (NumberFormatException e) {
                    System.out.println("ERROR!");
                    fib_out.setText("ERROR! ONLY NUMBERS ARE ALLOWED!");
                    throw e; fibMain.fibonacci(start, length);      }

这是我的工作代码,我很想用 start 和 length 参数简单地调用该方法。

我希望能够在 SceneBuilder 中使用参数 start 和 length 调用 Method 并将它们链接到 ActionEvcent。

【问题讨论】:

  • 您好,谢谢您的回复。我已经将我的控制器与我的 Fxml 链接了。我也可以调用方法,但不能调用带参数的方法。我在你提供的那个问题中遗漏了什么吗?
  • 我添加了一个答案。关键是您不能将任意方法链接到节点,但事件处理程序方法本身可以调用您要调用的其他方法。
  • 为什么要这样实现解析输入?循环总是只有一次迭代,那么为什么要使用一次呢?此外,假设输入有效,您总是会覆盖作为start 参数传递的值,那么为什么还要传递它呢? length 相同。此外,编译器应该抱怨您在使用 throw 语句退出 catch 块后添加语句。为什么不直接在事件处理程序中解析输入,并以结果作为参数调用原始fibonacci 方法(您可能需要做一些工作才能正确输出)。

标签: java javafx scenebuilder


【解决方案1】:

我假设您有两个 TextFields 用于不同的输入,以及类似 Button 的东西来开始计算。您链接到Button 的方法应该将每个TextField 的文本解析为ints,然后调用您的斐波那契方法。您可以通过将TextFields 注入控制器实例来访问它们。这是通过在 FXML 文件中为它们提供一个 fx:id 属性来完成的,该属性的值与控制器类中的字段名称匹配。

FXML 示例:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.VBox?>

<VBox xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" 
      fx:controller="com.example.Controller" alignment="CENTER" spacing="10">

    <padding>
        <Insets topRightBottomLeft="15"/>
    </padding>

    <TextField fx:id="startField" promptText="Start"/>

    <TextField fx:id="lengthField" promptText = "Length"/>

    <Button text="Compute" onAction="#handleCompute"/>

</VBox>

示例控制器:

package com.example;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.scene.control.TextField;

public class Controller {

    // Will be injected by FXMLLoader
    @FXML private TextField startField;
    @FXML private TextField lengthField;

    @FXML
    private void handleCompute(ActionEvent event) {
        event.consume();

        // Omitted error handling. If there was an exception one option is to
        // show a javafx.scene.control.Alert to the user.
        int start = Integer.parseInt(startField.getText());
        int length = Integer.parseInt(lengthField.getText());

        // Needs to be defined. Do something with result?
        fibonacci(start, length);
    }

}

注意:我没有包含向用户显示结果的方法。然而,一个简单的选择是包含一个Label,以与TextFields 相同的方式将其注入控制器,并在计算完成时设置其text 属性。

注意:您可以通过设置TextFormatter 来限制可以在TextField 中输入的字符。见this question

【讨论】:

  • 我添加了 catch and try 部分,它工作得非常好。谢谢
猜你喜欢
  • 2012-09-19
  • 2018-04-06
  • 2014-11-02
  • 1970-01-01
  • 2013-12-07
  • 1970-01-01
  • 1970-01-01
  • 2020-01-03
  • 1970-01-01
相关资源
最近更新 更多