JavaFX не печатает сетку на BorderPane - PullRequest
0 голосов
/ 05 мая 2019

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

Я пытался использовать Gluon SceneBuilder, но я намерен избегать его генерации вручную, поскольку он генерирует чрезмерное количество кода.

Мой компонент управления игрой выглядит следующим образом:

public class GameController implements Initializable {

    public Pane gamePane;

    @FXML
    private GridPane gridPane;

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        gridPane = new GridPane();
        for (int i = 0; i < SudokuBoard.ROW_NUM; i++) {
            for (int j = 0; j < SudokuBoard.ROW_NUM; j++) {
                TextField field = new TextField(String.valueOf(0));
                field.setFont(Font.font(24));
                gridPane.add(field, i, j);
            }
        }

        gamePane.getChildren().add(gridPane);

    }
}

и мой файл fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.BorderPane?>


<?import javafx.scene.layout.GridPane?>
<BorderPane fx:id="gamePane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1">
   <top>
      <Label fx:id="gameLabel" text="Sudoku Game" BorderPane.alignment="CENTER" />
   </top>
   <center>
      <GridPane/>
   </center>
</BorderPane>

Я думаю, что манипулирование кодом таким способом может дать ожидаемый результат, но это не так.Может ли быть так, что файл fxml препятствует автоматической генерации текстовых полей панели сетки?

1 Ответ

1 голос
/ 06 мая 2019

Все проблемы, которые я видел, были пропущены несколько вещей, но после исправления он работал хорошо для меня, во-первых, у вас не было контроллера, подключенного к fxml, вам это может фактически не понадобиться в зависимости от того, как вы загружаете свой fxml (чего я не могу см)

Мне просто нужно было добавить этот раздел в часть панорамы

fx:controller="FXMLFolder.Controller"

или в зависимости от структуры вашего проекта

fx:controller="Controller"

вроде так

<BorderPane fx:id="gamePane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" 
        prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/11.0.1"  xmlns:fx="http://javafx.com/fxml/1" 
        fx:controller="FXMLTests.Controller">

Затем вы вызываете gridpane, который выглядит как прикрепленный к fxml, потому что аннотация, но не так, как у вас нет fx:id в fxml, так что измените это

<GridPane/>

до

<GridPane fx:id="gridPane"/>

старайтесь быть последовательными при объявлении вашей переменной, чтобы не путать других, читающих ваш код, поэтому сопоставьте

public Pane gamePane;
@FXML
private GridPane gridPane;

до

public Pane gamePane;
public GridPane gridPane;
public Label gameLabel;//I added this because you have an `fx:id` in your fxml
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...