2014-09-22 2 views
0

Я работаю над программой javafx, использующей FXML. Я пытаюсь динамически создавать TilePane из информации, извлеченной из одной сцены, и я не могу заставить TilePane отображаться. Я пробовал все, о чем я могу думать, и я в тупике. Я размещаю соответствующий код ниже. Спасибо за помощь!Невозможно создать динамически созданный JavaFX TilePane

EDIT: Я упростил приведенный ниже код для удобства чтения. Если этого недостаточно, я сделаю MCVE.

Главный контроллер

@FXML private ScrollPane gridScroll; 
     private TilePane tPane; 

//Method to build each cell for the tilepane 
private StackPane buildCell(Stitch stitch){ 

    StackPane pane = new StackPane(); 
    pane.setPrefSize(5, 5); 

    // add labels to stackpane 
    Label stitchLabel = new Label(stitch.getStitchType().toString()); 
    Label strandLabel = new Label(stitch.getNumStrands().toString()); 

    //create rectangle to color stackpane 
    Rectangle rect = new Rectangle (5, 5); //set rectangle to same size as stackpane 
    rect.setFill(stitch.getDisplayColor()); //Color the rectangle 
    rect.setStroke(Color.BLACK); //border the rectangle in black 

    pane.getChildren().addAll(stitchLabel, strandLabel, rect); 

    return pane; 
} 

protected void createTiles(Stitch[][] stitchArray, int width, int height){ 

    tPane = new TilePane(); //Create a new tilepane 
    gridScroll.setContent(tPane); //add tilepane to existing scrollpane 

    tPane.setPrefColumns(width); //set prefcolumns to the array width 

    //add cells to tilepane 
    for (int i=0; i<width; i++){ 
     for (int j=0; j<height; j++){ 
      StackPane cell = buildCell(stitchArray[i][j]); 
      tPane.getChildren().add(cell); 
     } 
    } 

} 

код из вторичного контроллера, который вызывает tilepane быть создан

@FXML void finish(){ 

    //create data to populate tilepane with 
    Stitch[][] stitchArray = floss.ImageConversion.createStitchArray(posterizedImage); 
    int width = (int) currentPicWidth; //cast double to int 
    int height = (int) currentPicHeight; //cast double to int 

    //get the main Controller 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("InStitchesFXML.fxml")); 
    try { 
     loader.load(); 
    } catch (IOException e) {e.printStackTrace();} 

    InStitchesController isCtrl = loader.getController(); 

    //create the tiles 
    isCtrl.createTiles(stitchArray, width, height); 

    //close the stage 
    importStage.close(); 

} 

Я надеюсь, что это помогает прояснить вещи.

+0

Возможный дубликат [JavaFX FileChooser Throws Error (возможно, легко исправить, но все еще запутано)] (http://stackoverflow.com/questions/23094846/javafx-filechooser-throws-error-probably-easy-fix-but- еще смущен). Также см. Http://stackoverflow.com/questions/23105433/javafx-8-compatibility-issues-fxml-static-fields –

+0

Реализованы предложения из этого потока, но у меня все еще возникают проблемы. Сообщение было обновлено, чтобы отразить их. –

+0

Я не вижу ничего плохого в вашей обновленной версии, но это довольно сложно, и код не завершен. Возможно, вы можете создать [MCVE] (http://stackoverflow.com/help/mcve), который выполняет только то, что вы описываете (например, этап с кнопкой и панелью плитки, которая открывает новый FXML и заполняет панель плитки) и не более, и опубликуйте это. Как минимум, удалите все поля, которые никогда не ссылаются, такие как 'primaryStage' и' stitchArray' в 'InStitchesController'. –

ответ

0

Исправлено. Я переписал свой код на основе this учебника.

Затем я создал объект BooleanProperty и добавил к нему прослушиватель изменений. Когда BooleanProperty был установлен в true, код для создания фрагментов был выполнен. Затем я установил BooleanProperty в true, когда я вышел из диалогового окна создания плитки.

Если у кого есть вопросы, я могу опубликовать фрагменты кода.

+0

Итак, код в вашем вопросе теперь работает? –

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