我对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();
}
答案 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
...