Я хотел бы знать, что именно происходит, когда красный крест нажимается в диалоговых вдовах.JavaFX Реализация по умолчанию для закрытия Windows
У меня есть диалог, который добавляет данные в динамический LineChart
и обновляет график с новой точкой. Проблема в том, что при закрытии диалогового окна программно после добавления задания пользовательский интерфейс не обновляется должным образом. Но если я не закрываю его программно и просто нажимаю кнопку по умолчанию, все в порядке.
Мой код закрытия была следующей строки, которая не обновляется интерфейс правильно:
((Button)actionEvent.getSource()).getScene().getWindow().hide();
и когда я использую Platform.runLater()
сделать так, иногда обновления, а иногда нет!
Platform.runLater(new Runnable() {
@Override
public void run() {
((Button)actionEvent.getSource()).getScene().getWindow().hide();
}
});
Кстати, если вы хотите увидеть, как работа обновление идет, вот она:
У меня есть диалог, который определен в файле FXML и имеет два текстовых поля для получения х и у, а также a Добавить кнопку. Эта кнопка Add имеет метод onAction
под названием handleAddButton()
, который определен в классе DialogController
. Тогда в этом методе, я называю addData()
метод из LineChartController
класса, как показано ниже:
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();
}
});
}
И Это реализация addData()
метод в LineChartController
классе:
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());
});
}
Я хотел бы знать, что точно закрытие по умолчанию делает, что держит все в порядке и что не так с моим кодом.
Как вы извлекаете x, y из диалога? – Omid
@omid 'Number x = new NumberStringConverter(). FromString (timeField.getText());' –
Я не думаю, что проблема связана с методом addData. Правильно ли получены х, у? Можете ли вы добавить код для диалога, как вы его показываете и где вы получаете x и y от него? Без этого вам не поможет. – Omid