当前位置: 首页 > 知识库问答 >
问题:

如何在JavaFX中重新运行程序

张锐藻
2023-03-14

我有2个控制器为2个fxml文件。在一个控制器中,我有一个handleopen函数,它打开一个文件选择器,并给出一个我称之为Model的类的路径。然后在另一个控制器上有一个函数TreetableDraw在单击Draw按钮并运行程序后获取该路径。我有另一个按钮来重置程序。它将结果设置为null,但当打开另一个文件运行时,程序崩溃,因为路径为null。如何重置程序并使其使用从打开文件选择器中选择的新路径?

//Gets the path from model and runs the program
public void treeTableDraw(ActionEvent event) {

    new Controller(model.getText());
    drawTable();
    numberOfFunctions = dc.getFuncAll().size();
    numberOfOrganizations = dc.getSortedAssignedOrg().size();
    funcLabel.setText(numberOfFunctions + "");
    orgLabel.setText(numberOfOrganizations + "");
    btnDraw.setDisable(true);

}

/**
 * Clrears TreeTableView and sets back labels
 * 
 * @param event
 */
public void treeTableReset(ActionEvent event) {
    btnDraw.setDisable(false);
    model.setText(null);
    funcLabel.setText("0");
    orgLabel.setText("0");
    treeTable.getColumns().clear();

}
@FXML
private void handleOpen() {

    FileChooser fileChooser = new FileChooser();

    // Set extension filter
    FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter(
            "3lgm2 files (*.z3lgm)", "*z3lgm");
    fileChooser.getExtensionFilters().add(extFilter);

    // Show open file dialog
    File file = fileChooser.showOpenDialog(main.getPrimaryStage());

    if (file != null) {
        path = file.toString();

        model.setText(path);

    }

}
public class Model {
private final StringProperty text = new SimpleStringProperty();

public StringProperty textProperty() {
    return text;
}

public final String getText() {
    return textProperty().get();
}

public final void setText(String text) {
    textProperty().set(text);
}

}
public class Main extends Application {
private Stage primaryStage;
private BorderPane rootLayout;
private Model model = new Model();


@Override
public void start(Stage primaryStage) {

    this.primaryStage = primaryStage;
    this.primaryStage.setTitle("IT-Saturation");
    initRootLayout();
    showOverView();

}

private void showOverView() {
    try {
        FXMLLoader loader = new FXMLLoader();

        loader.setLocation(Main.class.getResource("/view/OverView.fxml"));
        loader.setController(new OverViewController(model));

        AnchorPane overView = (AnchorPane) loader.load();
        rootLayout.setCenter(overView);

    } catch (IOException e) {
        e.printStackTrace();
    }
}

private void initRootLayout() {
    try {
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(Main.class.getResource("/view/RootLayout.fxml"));
        loader.setController(new RootLayoutController(model));

        rootLayout = (BorderPane) loader.load();
        // show scene containing the root layout
        Scene scene = new Scene(rootLayout);
        scene.getStylesheets().add(
                getClass().getResource("application.css").toExternalForm());
        primaryStage.setScene(scene);
        // gives controller access to main
        RootLayoutController controller = loader.getController();
        controller.setMainApp(this);
        primaryStage.show();

    } catch (IOException e) {

        e.printStackTrace();
    }

}


/**
 * Returns the main stage.
 * 
 * @return primaryStage
 */
public Stage getPrimaryStage() {

    return primaryStage;
}

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

public void showMostComputerizedStatistics() {
    try {
        // Load the fxml file and create a new stage for the popup.
        FXMLLoader loader = new FXMLLoader();
        loader.setLocation(Main.class
                .getResource("view/BirthdayStatistics.fxml"));
        AnchorPane page = (AnchorPane) loader.load();
        Stage dialogStage = new Stage();
        dialogStage.setTitle("Birthday Statistics");
        dialogStage.initModality(Modality.WINDOW_MODAL);
        dialogStage.initOwner(primaryStage);
        Scene scene = new Scene(page);
        dialogStage.setScene(scene);

        // Set the persons into the controller.
        MostComputerizedController controller = loader.getController();

        dialogStage.show();

    } catch (IOException e) {
        e.printStackTrace();
    }
}

共有1个答案

经和洽
2023-03-14

问题不在于路径。我不得不重置在程序的前一次运行中初始化的数据。因此,在将path设置为null之后,我只需要更新类的实例,它引用了数据。

...

public void treeTableReset(ActionEvent event) {
    btnDraw.setDisable(false);
    //model.setText(null);
    funcLabel.setText("0");
    orgLabel.setText("0");
    treeTable.getColumns().clear();
    dc = new DataConstructor();

} 
 类似资料:
  • 我有一个swing应用程序,需要在其中运行和打开JavaFX场景/阶段。我必须在没有扩展应用程序的情况下运行它。我已经尝试了Stackoverflow上发布的大多数解决方案,但没有一个在我的情况下有效。 这是我的最新尝试,我正在获得NullPointerException。我的舞台变空了。此行->[stage.setscene(new Scene(root,SCENEWIDTH,SCENEHEIG

  • (我是java BTW的新手!)

  • 我读了这个https://bugs.openjdk.java.net/browse/JDK-8102128,但我还没有在JavaFX 8的Api中找到一些东西。在TableView中没有防止重新排序的方法吗?

  • 我的朋友最近给我发送了我们正在处理的javaFX项目的源代码。但是我无法运行它,因为它没有正确配置。如果我尝试将其配置为“应用程序”,但它不允许我选择MainClass文件。它最初是在Eclipse中编程的。有人能解释一下我如何运行这个程序吗?在项目结构中,我将Artifacts设置为javaFX应用程序,但这似乎没有改变什么。

  • 我已经安装了intellij,并且试图打开一个新的javafx,但是我无法运行它(即使是基本的默认的,应该只是打开一个简单的窗口)。我使用的是JDK11(我必须),所以我下载了javafx,就像本文中所说的那样: 错误:JavaFX运行时组件丢失,而使用JDK 11运行此应用程序需要JavaFX运行时组件 但我得到了这个错误 如果我试着在溶液中做这一行 然后在run->edit configura

  • 即使在Eclipse中安装了javafx程序,我也不能运行javafx程序。我在运行javafx程序后遇到的错误