在Javafx中触发事件后获取值

时间:2018-08-23 04:31:10

标签: java javafx

我对JavaFX还是比较陌生,并且已经在论坛上搜索了几天,但是我没有找到解决问题的明确方法。请考虑以下代码:

    public class MeasureController implements Initializable {

    double retdx;

    public void dxCalc() {
    double dx = 5;
    retdx = dx;
    }

    @FXML
    void fireMeasure(ActionEvent event) {
    dxCalc();   
    }
}

如上所述,我有一个名为 MeasureController 的类,还有一个场景节点(按钮),当用户按下该节点时,它将在 fireMeasure < / em>事件。我的问题是我无法获取值 double retdx double dx 并将其传递给另一个类控制器。我已经尝试使用以下代码,但似乎没有任何作用:

public class DataController extends Thread implements Initializable {

FXMLLoader fxmlLoader = new 
FXMLLoader(getClass().getResource("Measure.fxml"));
Parent offsetScene = (Parent) fxmlLoader.load();
Stage offsetStage = new Stage();
offsetStage.initStyle(StageStyle.UTILITY);
offsetStage.setScene(new Scene(offsetScene));
offsetStage.show();

MeasureController ofX = new MeasureController();        
double setX = ofX.retdx;    
}

或:

public class DataController extends Thread implements Initializable {

FXMLLoader fxmlLoader = new 
FXMLLoader(getClass().getResource("Measure.fxml"));
Parent offsetScene = (Parent) fxmlLoader.load();
Stage offsetStage = new Stage();
offsetStage.initStyle(StageStyle.UTILITY);
offsetStage.setScene(new Scene(offsetScene));
offsetStage.show();

MeasureController ofX = new MeasureController();        
double setX = ofX.dxCalc();
}

2 个答案:

答案 0 :(得分:0)

您看到如何使用dxCalc()关键字定义void方法吗? void关键字告诉Java您希望该方法执行某项操作,但是您不需要它返回任何内容。

void是所谓的“返回类型”,即方法返回的值的类型。 void本质上是“无”。

现在,举一个例子:

String getName() {
    return "Rob";
}

这也是一种方法,但是您看到void如何更改为String吗?这意味着无论何时调用此方法,您都将得到一个String作为回报。方法中的return关键字实际上是告诉Java要返回的值。

因此,在上述示例中,如果我们要使用以下代码:

System.out.println(getName());

输出为:

robert

在您的情况下,您正在调用dxCalc()方法,但是由于该方法没有返回值,因此您无法对计算结果进行任何操作。

如果要将方法更改为以下内容:

double dxCalc() {
  double dx = 5.0;
  return dx;
}

您正在告诉Java,当调用dxCalc()方法时,请发送回double值。因此,在FXML按钮的fireMeasure()方法中,您可以使用如下所示的值,例如:

@FXML
void fireMeasure() {
  System.out.println(dxCalc());
}

dxCalc()方法调用替换为该方法返回的值,以便打印5.0

答案 1 :(得分:0)

MeasureController ofX = new MeasureController();
double setX = ofX.dxCalc();

这不是应该获取控制器实例的方式。您在此处创建的实例未与fxml一起使用。相反,您应该使用FXMLLoader.getController访问在加载fxml时创建的控制器实例:

MeasureController ofX = load.getController();

请注意,声明

double setX = ofX.dxCalc();
在用户有机会与新窗口进行交互之前执行

。您应允许DataController监听用户与GUI交互所导致的事件。
如果您只想在值更改时收到通知,则可以例如将DoubleProperty添加到MeasureController

public class MeasureController implements Initializable {

    private final ReadOnlyDoubleWrapper retdx = new ReadOnlyDoubleWrapper();

    public double getRetdx() {
        return retdx.get();
    }

    public ReadOnlyDoubleProperty retdxProperty() {
        retrun retdx.getReadOnlyProperty​();
    }

    private void dxCalc() { // should there be access to this method from outside this class? imho no -> private
        double dx = 5;
        retdx.set(dx);
    }

    @FXML
    void fireMeasure(ActionEvent event) {
        dxCalc();   
    }
}
offsetStage.show();

MeasureController ofX = loader.getController();
ofX.retdxProperty().addListener((o, oldValue, newValue) -> {
    // do something on value change
    System.out.println(newValue);
});

如果您希望接收事件而不管其值如何变化,则可以向addListener添加自己的MeasureController(或类似名称)方法,例如您可以将Consumer<Double>传递给将消费者存储在一个列表中的那个,并在调用dxCalc时将dx传递给列表中的所有Consumer ...