JavaFx включает несколько графических интерфейсов в основной графический интерфейс

У меня есть основной графический интерфейс в файле fxml, созданный с помощью SceneBuilder и связанного с ним контроллера. В этом основном графическом интерфейсе у меня есть панель сетки, в которой я хочу поместить для каждой ячейки три дочерних элемента (метка, TextView и CheckBox). Поэтому я создал дополнительный fxml с HBox в качестве root и тремя дочерними элементами.

Теперь... Как я могу добавить с помощью кода в сетку основного графического интерфейса определенный компонент для каждой ячейки и взаимодействует с ними?

Я имею в виду... то, что я хочу сделать, это что-то вроде этого в главном контроллере графического интерфейса:

для (int i) для (int j) gridpane.add("the_composed_view_in_the_other_fxml", i, j)


person Sliver    schedule 06.04.2016    source источник


Ответы (1)


Если я правильно понимаю ваш вопрос, вы должны сделать что-то вроде этого в методе initialize вашего «основного» контроллера:

public class MainController {

    @FXML
    private GridPane gridpane ;

    public void initialize() throws IOException {
        int numCols = ... ;
        int numRows = ... ;

        for (int rowIndex = 0 ; rowIndex < numRows ; rowIndex++) {
            for (int colIndex = 0 ; colIndex < numCols ; colIndex++) {
                FXMLLoader loader = new FXMLLoader(getClass().getResource("path/to/addtional/fxml"));
                gridpane.add(loader.load(), colIndex, rowIndex);
            }
        }
    }
}

За «взаимодействие» с компонентами, загружаемыми из дополнительного файла fxml, действительно отвечает контроллер дополнительного файла fxml. Вы можете получить ссылку на каждый из этих контроллеров после загрузки файла fxml:

gridpane.add(loader.load(), colIndex, rowIndex);
AdditionalController controller = loader.getController();

а затем вы можете вызывать методы, которые вы определили в этом классе контроллера. На самом деле вы не предоставили достаточно подробностей о том, что вы можете здесь сделать, но, например:

public class AdditionalController {

    @FXML
    private CheckBox checkBox ;

    public BooleanProperty selectedProperty() {
        return checkBox.selectedProperty();
    }

    // etc...
}

а потом что-то вроде

gridpane.add(loader.load(), colIndex, rowIndex);
AdditionalController controller = loader.getController();

String s = String.format("Item [%d, %d]", colIndex, rowIndex);
controller.selectedProperty().addListener((obs, wasSelected, isNowSelected) -> {
    if (isNowSelected) {
        // process selection...
        System.out.println(s + " is selected");
    }
});
person James_D    schedule 06.04.2016