在Javafx中触发事件后获取值
我对JavaFX比较陌生,我已经在论坛上搜索了几天,但我还没有找到解决问题的明确方法。请考虑以下代码:在Javafx中触发事件后获取值,java,javafx,Java,Javafx,我对JavaFX比较陌生,我已经在论坛上搜索了几天,但我还没有找到解决问题的明确方法。请考虑以下代码: public class MeasureController implements Initializable { double retdx; public void dxCalc() { double dx = 5; retdx = dx; } @FXML void fireMeasure(ActionEvent even
public class MeasureController implements Initializable {
double retdx;
public void dxCalc() {
double dx = 5;
retdx = dx;
}
@FXML
void fireMeasure(ActionEvent event) {
dxCalc();
}
}
如上所示,我有一个名为MeasureControl的类,还有一个场景节点(按钮),当用户按下该节点时,它将调用fireMeasure事件中的方法。我的问题是我无法获取值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;
}
或:
您看到如何使用
void
关键字定义dxCalc()
方法了吗?void
关键字告诉Java您希望该方法执行某些操作,但不需要从中返回任何内容
void
是所谓的“返回类型”,即方法返回的值的类型<代码>无效本质上意味着“无”
现在,以下面的例子为例:
String getName() {
return "Rob";
}
这也是一种方法,但您可以看到void
如何更改为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
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();
}
}
如果您对接收事件感兴趣,而不考虑值的变化,则可以将自己的addListener
(或类似名称)方法添加到MeasureController
,例如,您可以将Consumer
传递给将消费者存储在列表中的用户,并在调用dxCalc
时将dx
传递给列表中的所有Consumer
s…我也尝试了上述建议。如果仅在firemease()
中调用dxCalc()
,则解决方案工作正常,这意味着在同一控制器中。我的问题是在点击fireMeasure()
按钮后,我无法获取返回dx的值代码>来自另一个控制器,它在我的代码中位于DataController
类的上方。如果在添加返回类型后,从DataController
调用带有括号的of x.dxCalc()
,它应该可以正常工作。如果您收到错误消息,您应该将其添加到问题中。否则,仅仅说“无法获得价值”对我们来说是不可能解决的。编辑:谢谢你的回答。我在另一个类中实例化了该对象,如下所示:MeasureController of x=new MeasureController();双偏移量x=ofX.dxCalc();系统输出打印项次(抵销)代码>但输出为0而不是5。输出窗口中没有错误,因此我不知道出了什么问题。除非dxCalc()
方法提供return
语句,否则该值将始终为0。谢谢。我会接受你的答案,因为它的工作为代码我上述。我将试着用你的上述评论来重新构建我的问题。谢谢,这就是我一直在寻找的东西。你的解决方案解决了我的问题。现在,我只需要将show()
更改为showAndWait()
,这样用户就可以在继续的方法开始之前输入所需的参数。
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);
});