2015-03-11 5 views
0

Буду признателен за любую помощь, я потратил часы на это безрезультатно.JavaFX добавляет пользовательский класс к родительскому узлу

Поэтому мне нужно добавить экземпляр класса, который я нашел в сети под названием GridDisplay, к корню родителя, так как мне нужна сцена, чтобы отобразить это для меня. Но мне также нужно использовать файл fxml для настройки корня и, следовательно, сцены. Вот то, что я до сих пор:

@FXML private BorderPane mainPanel = new BorderPane(); 
@FXML private TilePane tilePane = new TilePane(); 
@FXML private Pane topCanvas = new Pane(); 
@FXML private Pane leftCanvas = new Pane(); 
@FXML private Pane rightCanvas = new Pane(); 
@FXML private Pane bottomCanvas = new Pane(); 
@FXML private ScrollPane scrollPane = new ScrollPane(); 
@FXML private Button stacksButton = new Button(); 
@FXML private Button queueButton = new Button(); 
@FXML private Button stepStacksButton = new Button(); 
@FXML private Button stepQueueButton = new Button(); 

private MazeSolver solver; 
private GridDisplay gridDisplay; 
private ArrayList<String> maze; 
private String fileLocation; 
private int height; 
private int width; 

@Override 
public void start(Stage primaryStage) throws IOException, InterruptedException 
{ 
    solver = new MazeSolver(fileLocation); 
    int[] dimensions = solver.getDimensions(); 
    this.width = dimensions[0]; 
    this.height = dimensions[1]; 
    maze = solver.getMazeLayout(); 

    primaryStage.setTitle("Maze Solver"); 


    //this is the root which uses the fxml file and in turn sets up the scene 
    Parent root = FXMLLoader.load(getClass().getResource("MazeApp.fxml")); 
    Scene scene = new Scene(root); 


    //Represents the grid with Rectangles 
    gridDisplay = new GridDisplay(height, width); 
    gridDisplay.setMaze(maze); 

    mainPanel = new BorderPane(); 

    //here i set the scroll pane as the mainPanel's content 
    mainPanel.setCenter(scrollPane); 

    //and then set the gridDisplay as the scroll panes content 
    scrollPane.setContent(gridDisplay.getDisplay()); 

    //re paints the grid and its boxes 
    gridDisplay.createElements(); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 

} 

Порядок, в котором я делать какие-либо из этих вещей не имеет никакого значения, это просто не показывает. Я всегда остаюсь с окном и пустым пространством, где должен находиться лабиринт, например: https://www.dropbox.com/s/rqxa9dy2w9lw4tz/Screenshot%202015-03-11%2022.01.46.png?dl=0 (извините за ссылку, изображение с кастомным сообщением напрямую).

Любая помощь была бы принята с благодарностью.

EDIT: Мой GridDisplay класс:

public class GridDisplay{ 

private static final double ELEMENT_SIZE = 30; 
private static final double GAP = ELEMENT_SIZE/90; 

private TilePane tilePane = new TilePane(); 
private Group display = new Group(tilePane); 
private int nRows; 
private int nCols; 
private ArrayList<String> maze = null; 

public GridDisplay(int nRows, int nCols) 
{ 
    tilePane.setStyle("-fx-background-color: rgba(255, 215, 0, 0.1);"); 
    tilePane.setHgap(GAP); 
    tilePane.setVgap(GAP); 
    setColumns(nCols); 
    setRows(nRows); 
} 

public void setColumns(int newColumns) 
{ 
    nCols = newColumns; 
    tilePane.setPrefColumns(nCols); 
    createElements(); 
} 

public void setRows(int newRows) 
{ 
    nRows = newRows; 
    tilePane.setPrefRows(nRows); 
    createElements(); 
} 

public TilePane getDisplay() 
{ 
    return tilePane; 
} 

public void createElements() 
{ 
    tilePane.getChildren().clear(); 
    for (int i = 0; i < nRows; i++) { 
     for (int j = 0; j < nCols; j++) { 
      if(maze==null) 
       tilePane.getChildren().add(createElement(Color.RED)); 
      else 
      { 
       Color color = Color.WHITE; 
       if(Character.toString(maze.get(i).charAt(j)).equals("#")) 
        color = Color.BLACK; 
       if(Character.toString(maze.get(i).charAt(j)).equals("o")) 
        color = Color.GREEN; 
       if(Character.toString(maze.get(i).charAt(j)).equals("*")) 
        color = Color.RED; 
       tilePane.getChildren().add(createElement(color)); 
      } 
     } 
    } 
} 

public void colorSolved() 
{ 
    tilePane.getChildren().clear(); 
    for (int i = 0; i < nRows; i++) { 
     for (int j = 0; j < nCols; j++) { 
      if(maze==null) 
       tilePane.getChildren().add(createElement(Color.RED)); 
      else 
      { 
       Color color = Color.WHITE; 
       if(Character.toString(maze.get(i).charAt(j)).equals("#")) 
        color = Color.BLACK; 
       if(Character.toString(maze.get(i).charAt(j)).equals("o")) 
        color = Color.GREEN; 
       if(Character.toString(maze.get(i).charAt(j)).equals("*")) 
        color = Color.RED; 
       tilePane.getChildren().add(createElement(color)); 
      } 
     } 
    } 
} 

public void setMaze(ArrayList<String> maze) 
{ 
    this.maze = maze; 
} 

private Rectangle createElement(Color color) { 
    Rectangle rectangle = new Rectangle(ELEMENT_SIZE, ELEMENT_SIZE); 
    rectangle.setStroke(Color.BLACK); 
    rectangle.setFill(color); 

    return rectangle; 
} 

}

я не могу разделить код для XML, поскольку он не будет вставить в это окно должным образом, вот картинка:

https://www.dropbox.com/s/27tbliubdlqdfzm/Screenshot%202015-03-12%2010.09.25.png?dl=0

+1

Нигде не появляется, чтобы добавить GridDisplay в root. Вы создаете BorderPane, поместите GridDisplay в ScrollPane (вы не указали, где это было определено) и поместите панель прокрутки в BorderPane. Но тогда ни один из них не помещается в сцену, сцена просто содержит макет FXML. Вам действительно нужно сделать это в классе контроллера, чтобы вы могли обращаться к элементам, определенным в FXML, и добавлять к ним свой DisplayPane. –

+0

Да, я вижу, как это моя проблема, только мне нужно добавить макет fxml из файла fxml, а также добавить GridDisplay в root, я не могу сделать оба. Это возможно? – Krang

+0

Какой тип макета является корневым? Возможно, опубликуйте немного своего FXML. В идеале вы бы просто создали GridDisplay на FXML, есть ли ссылка на API для GridDisplay? –

ответ

0

Поскольку ваш корень является BorderPane, вы можете просто установить соответствующий регион в коде:

BorderPane root = FXMLLoader.load(getClass().getResource("MazeApp.fxml")); 
Scene scene = new Scene(root); 


//Represents the grid with Rectangles 
gridDisplay = new GridDisplay(height, width); 
gridDisplay.setMaze(maze); 

ScrollPane scrollPane = new ScrollPane(); 
scrollPane.setContent(gridDisplay); 

root.setCenter(scrollPane); 

// etc 
+0

Большое спасибо, что решил. Я не могу продвигаться, поскольку у меня нет репутации, но я ценю это! – Krang

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