Как закрыть только один этап в Java FX (не выходя из всех приложений)? - PullRequest
0 голосов
/ 05 января 2019

Я знаю о System.exit (0) и Platform.exit () и stage.close (), но все они убивают все этапы. Любые идеи, как я могу убить одну стадию? Я имею в виду убить / закрыть, а не спрятаться.

EDIT: Я точно объясню, в чем моя проблема. У меня есть такой класс:

public class Controller extends Application implements Serializable {

private LineChart<String,Number> lineChart;

public void btn(javafx.event.ActionEvent actionEvent) throws IOException {
    Stage stage = new Stage();
    Scene scene = new Scene(lineChart,400,400);
    stage.setScene(scene);
    stage.show();
    stage.setOnCloseRequest( e-> stage.hide());
    }
}

Я создаю новый LineChart в конструкторе контроллеров. Проблема в том, что я вызываю метод btn () второй (и более) раз на одном и том же контроллере ... Я получил сообщение об ошибке «IllegalArgumentException: LineChart уже установлен как корень другой сцены». Когда я вызываю Platform.exit () / stage.close () / stage.hide () / System.exit (0) как setOnCloseRequest, мое главное окно (с меню и т. Д.) Также закрывается, и то, что я ожидаю, закрывает не более чем окно с LineChart.

1 Ответ

0 голосов
/ 08 января 2019

Вот пример работающей программы, которая покажет вам, как закрыть 1 окно или все окна

public class Main extends Application {

    private LineChart<Number,Number> lineChart;

    @Override
    public void start(Stage stage) {
        createLinechart();

        Button newWindowButton = new Button("Create window");
        newWindowButton.setOnAction(event -> createWindow());

        Scene scene = new Scene(newWindowButton);
        stage.setScene(scene);
        stage.show();
    }

    private void createWindow(){
        VBox vBox = new VBox();
        vBox.getChildren().add(lineChart);

        Button stageCloseButton = new Button("stage.close();");
        Button platformExitButton = new Button("Platform.exit()");
        Button systemExitButton = new Button("System.exit(0)");

        vBox.getChildren().addAll(stageCloseButton,platformExitButton,systemExitButton);

        Scene scene = new Scene(vBox);
        Stage stage  = new Stage();
        stage.setScene(scene);
        stage.show();

        stageCloseButton.setOnAction(event -> stage.close());
        platformExitButton.setOnAction(event -> Platform.exit());
        systemExitButton.setOnAction(event -> System.exit(0));
    }

    private void createLinechart(){
        final NumberAxis xAxis = new NumberAxis();
        final NumberAxis yAxis = new NumberAxis();
        xAxis.setLabel("Number of Month");
        //creating the chart
        lineChart = new LineChart<>(xAxis, yAxis);

        lineChart.setTitle("Stock Monitoring, 2010");
        //defining a series
        XYChart.Series series = new XYChart.Series();
        series.setName("My portfolio");
        //populating the series with data
        series.getData().add(new XYChart.Data(1, 23));
        series.getData().add(new XYChart.Data(2, 14));
        series.getData().add(new XYChart.Data(3, 15));
        series.getData().add(new XYChart.Data(4, 24));
        series.getData().add(new XYChart.Data(5, 34));
        series.getData().add(new XYChart.Data(6, 36));
        series.getData().add(new XYChart.Data(7, 22));
        series.getData().add(new XYChart.Data(8, 45));
        series.getData().add(new XYChart.Data(9, 43));
        series.getData().add(new XYChart.Data(10, 17));
        series.getData().add(new XYChart.Data(11, 29));
        series.getData().add(new XYChart.Data(12, 25));

        lineChart.getData().add(series);
    }

    public static void main(String[] args) { launch(args); }
}

Посмотрите, как вызов stage.close() не закрывает все окна, но два других делают так, как вы закрываете только одно окно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...