Я работаю над программой 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();
}
Я надеюсь, что это помогает прояснить вещи.
Возможный дубликат [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 –
Реализованы предложения из этого потока, но у меня все еще возникают проблемы. Сообщение было обновлено, чтобы отразить их. –
Я не вижу ничего плохого в вашей обновленной версии, но это довольно сложно, и код не завершен. Возможно, вы можете создать [MCVE] (http://stackoverflow.com/help/mcve), который выполняет только то, что вы описываете (например, этап с кнопкой и панелью плитки, которая открывает новый FXML и заполняет панель плитки) и не более, и опубликуйте это. Как минимум, удалите все поля, которые никогда не ссылаются, такие как 'primaryStage' и' stitchArray' в 'InStitchesController'. –