gpt4 book ai didi

JavaFX 关闭窗口的默认实现

转载 作者:太空宇宙 更新时间:2023-11-04 11:59:05 27 4
gpt4 key购买 nike

我想知道在对话框窗口中按下红叉时到底会发生什么。

我有一个对话框,它将数据添加到动态LineChart并使用新点更新图表。问题是,当我在添加作业后以编程方式关闭对话框时,UI 无法正确更新。但是,如果我不以编程方式关闭它,而只是按默认十字按钮,则一切正常。

我的结束代码是以下行,但从未正确更新 UI:

((Button)actionEvent.getSource()).getScene().getWindow().hide();

当我使用 Platform.runLater() 来执行此操作时,它有时会更新,有时不会!

Platform.runLater(new Runnable() {
@Override
public void run() {
((Button)actionEvent.getSource()).getScene().getWindow().hide();
}
});

顺便说一句,如果您想了解更新工作的进展情况,请参见:

我有一个在 fxml 文件中定义的对话框,有两个用于获取 x 和 y 的文本字段,还有一个添加按钮。此 Add 按钮有一个名为 handleAddButton()onAction 方法,该方法在 DialogController 类中定义。然后在此方法中,我从 LineChartController 类调用 addData() 方法,如下所示:

public void handleAddButton(ActionEvent actionEvent) {

Number x = new NumberStringConverter().fromString(timeField.getText());
Number y = new NumberStringConverter().fromString(bandWidthField.getText());

lineChartController.addData(x, y);

Platform.runLater(new Runnable() {
@Override
public void run() {
((Button)actionEvent.getSource()).getScene().getWindow().hide();
}
});
}

这是 LineChartController 类中的 addData() 方法实现:

public void addData(Number xValue, Number yValue){

if(xValue.intValue() < 0 || xValue.intValue() > 3000 ||
yValue.intValue() < 0 || yValue.intValue() > 1000)
return;
XYChart.Data<Number , Number> data =
new XYChart.Data<>(SystemUtil.round(xValue.intValue()), SystemUtil.round(yValue.intValue()));
seri.getData().add(data);

Node currentNode = data.getNode();
currentNode.setCursor(Cursor.HAND);
currentNode.setOnMouseDragged(event -> {
Point2D pointInScene = new Point2D(event.getSceneX(), event.getSceneY());
double xPosInAxis = timeAxis.sceneToLocal(new Point2D(pointInScene.getX(), 0)).getX();
double yPosInAxis = bandWidthAxis.sceneToLocal(new Point2D(0, pointInScene.getY())).getY();
int x = timeAxis.getValueForDisplay(xPosInAxis).intValue();
int y = bandWidthAxis.getValueForDisplay(yPosInAxis).intValue();
data.setXValue(SystemUtil.round(x));
data.setYValue(SystemUtil.round(y));
});
currentNode.setOnContextMenuRequested(e -> {

if(chartContextMenu.isShowing())
chartContextMenu.hide();
dataContextMenu.setUserData(data);
dataContextMenu.show(lineChart1, e.getScreenX(), e.getScreenY());
});
}

我希望我能知道默认关闭的具体作用是什么,它使一切正常,以及我的代码有什么问题。

最佳答案

终于,我找到了解决办法。似乎 native 关闭按钮在隐藏对话框之前以某种方式放置了延迟,并让后台操作正确完成工作。

现在,只需将此 sleep 时间放在addData()方法的末尾,一切就OK了:

 try {
Thread.sleep(30);
} catch (InterruptedException e) {
e.printStackTrace();
}

很明显,在 handleAddButton() 方法中以及关闭代码之前添加此部分也是可行的。但因为我从很多地方调用 addData(),所以我更喜欢把它放在那里。

关于JavaFX 关闭窗口的默认实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41100595/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com