Хобрук: Ваш путь к мастерству в программировании

Динамически добавлять виджеты в сцену через fxml или конструктор сцен в JavaFX.

Я работаю над простым BeatBox, где воспроизводятся разные звуки в зависимости от установленных флажков.

Программа должна иметь 256 флажков, отображаемых на сетке 16x16. Поэтому, когда я создаю графический интерфейс с помощью прямого кода (т.е. без fxml или построителя сцены), я могу легко создать простой цикл для создания 256 флажков, добавить их в список, чтобы я мог использовать их позже, и добавить их в сетка.

Я пытаюсь изменить этот подход и сделать это с помощью конструктора сцен или кодирования непосредственно в файле fxml, но я не могу найти способ сделать это и даже не знаю, возможно ли это. Пытаясь понять это, я столкнулся с этим сомнением: - Есть ли способ создать список виджетов какого-либо типа, заполненный множеством компонентов (в моем примере список с 256 флажками), через fxml или построитель сцен , а затем получить ссылку на список в моем классе Controller?

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

Заранее спасибо!


Ответы:


1

Формат FXML не позволяет объявлять элементы в цикле. Поскольку Scene Builder — это просто редактор WYSIWYG для файлов FXML, он также не предоставляет эту функциональность, а также не обеспечивает ярлык для объявления и настройки 256 элементов (например, через диалоговое окно или что-то в этом роде). Это один из тех случаев, когда добавление узлов в код является правильным решением.

Для этого вам нужно связать файл FXML с контроллером. Оттуда вы можете создать все 256 CheckBoxes внутри метода initialize. Этот метод исходит из интерфейса Initializable, хотя, поскольку JavaFX 8 вам больше не нужно реализовывать интерфейс. Вместо этого вы просто объявляете метод без аргументов с именем initialize (см. это) и аннотируете его @FXML, если он не-public.

Вот небольшой пример:

Файл FXML

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

<?import javafx.scene.layout.GridPane?>
<?import javafx.scene.layout.HBox?>

<!-- replace with your root -->
<HBox xmlns="http://javafx.com/javafx/11.0.2" xmlns:fx="http://javafx.com/fxml/1"
      fx:controller="com.example.Controller">

    <GridPane fx:id="grid"/>

    <!-- other elements... -->

</HBox>

Контроллер

package com.example;

import javafx.fxml.FXML;
import javafx.scene.control.CheckBox;
import javafx.scene.layout.GridPane;

public class Controller {

    @FXML private GridPane grid;
    private CheckBox[][] boxes; // for access by grid coordinates

    @FXML
    private void initialize() {
        boxes = new CheckBox[16][16];
        for (int row = 0; row < boxes.length; row++) {
            for (int col = 0; col < boxes[0].length; col++) {
                CheckBox box = new CheckBox();
                grid.add(box, col, row);
                boxes[row][col] = box;
            }
        }
    }

}
02.03.2019
  • Ну, я думаю, что мы все пришли к выводу, что тогда нет способа создать их напрямую через FXML. И да, делая это таким образом (с кодом), он выполняет задачу без проблем, как я сказал в своем вопросе. Я просто размышлял, можно ли это сделать в FXML, что, судя по ответам, которые я вижу, невозможно. Ваше здоровье! 02.03.2019
  • Вы правы в том, что и Амарильдо, и я говорим, что вы не можете сделать это в FXML или Scene Builder. Остальная часть моего ответа - это просто пример того, как это сделать, поскольку просто сказать «нет, вы не можете этого сделать» кажется только половиной ответа. Этот пример также является ответом на ваши слова Поэтому, когда я создаю графический интерфейс с помощью прямого кода (т.е. без fxml или построителя сцен)... — в частности, без fxml или построителя сцен часть. Я просто показывал вам способ сделать это в сочетании с FXML. Если вы уже знали, как это сделать, возможно, этот ответ поможет другим в будущем. 02.03.2019
  • Новые материалы

    Введение в контекст React
    В этом посте мы поговорим о Context API, который был представлен в React 16, и о том, как вы можете их использовать. Что такое контекст? Глядя на определение из react docs , оно..

    Шлюз с лицензией OSS, совместимый с Apollo Federation v2, появится в WunderGraph
    Сегодня мы рады сообщить, что мы сотрудничаем с поддерживаемой YC Tailor Technologies, Inc. для внедрения Apollo Federation v2. Реализация будет лицензирована MIT (Engine) и Apache 2.0..

    Это оно
    Ну, я официально уволился с работы! На этой неделе я буду лихорадочно выполнять последние требования Думающего , чтобы я мог сосредоточиться на поиске работы. Что именно это значит?..

    7 полезных библиотек JavaScript, которые вы должны использовать в своем следующем проекте
    Усильте свою разработку JavaScript Есть поговорка «Не нужно изобретать велосипед». Библиотеки — лучший тому пример. Это поможет вам написать сложные и трудоемкие функции простым способом...

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

    C в C.R.U.D с использованием React-Redux
    Если вы использовали React, возможно, вы знакомы с головной болью, связанной с обратным потоком данных. Передача состояния реквизитам от родительских компонентов к дочерним компонентам может..

    5 обязательных элементов современного инструмента конвейера данных
    В цифровом мире предприятия используют конвейеры данных для перемещения, преобразования и хранения огромных объемов данных. Эти конвейеры составляют основу бизнес-аналитики и играют..


    © 2024 hobruk.ru, Хобрук: Ваш путь к мастерству в программировании