2015-03-21 7 views
1

У меня есть 2 контроллера для 2 файлов fxml. В одном контроллере у меня есть функция handleOpen, которая открывает файл выбора и дает путь к классу, который я назвал моделью. Затем на другом контроллере функция, treeTableDraw, получает этот путь после нажатия кнопки рисования и запускает программу. У меня есть еще одна кнопка для сброса программы. Он возвращает результат обратно в null, но при открытии другого запускаемого файла программа вылетает из-за того, что путь равен NULL. Как я могу сбросить программу и использовать ее в новом пути, который выбран из открытого файла?Как перезапустить программу в JavaFX

//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(); 

} 

Это RootLayout класс, который имеет открытую функцию файла:

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

} 

Это главное, где я совмещаю два fxmls и ступень:

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

}

+0

Что делать, если вы используете: Файл 'File = fileChooser.showOpenDialog (новый этап());' это делает никакой разницы? – WonderWorld

+0

Нет, это то же самое. – Iman

+0

Может быть, 'path = file.getAbsolutePath();' будет делать трюк, но это сложно сказать, потому что я не вижу, где он идет не так. – WonderWorld

ответ

0

Проблема была не в пути. Мне пришлось сбросить данные, которые были инициализированы при первом запуске программы. Поэтому после установки пути к null я просто представил экземпляр класса, который ссылался на данные.

...

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

} 
Смежные вопросы