在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

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

    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);
});