2014-10-08 3 views
0

Мне нужно создать представление, в котором есть многослойный многоконтактный слой с 4-мя слоями с большим количеством флажков внутри них. Все вместе может быть около 30-40 флажков через Аккордеоны.Что такое хорошая практика для обработки множества флажков в JavaFX

Следующим шагом будет то, что у меня есть какая-то логика за всем этим. В зависимости от комбинации выбора флажков я соответственно изменю текстовую метку.

Мой процесс мышления был: я установил все эти флажки и дал им числовой идентификатор fx: id, представляющий собой позицию в вложенном графике гармоник. Что-то вроде «1_1» или «2_4_1». После этого я создаю один ChangeListener, вызывающий метод выбора флажка. Я могу найти Идентификатор флажка, посмотреть его в моих данных (чтобы увидеть, какой текст принадлежит ему, и если какие-либо правила мешают другим блокам) и обрабатывать логику соответственно, поместив идентификатор и его текст в Карту или Список, чтобы сохранить его на потом и отслеживать отмеченные поля.

Теперь я узнал, что получение fx: id - это не то, что JavaFX хочет, чтобы я сделал. Я не могу доставить собственный идентификатор в пользовательском свойстве внутри FXML либо (не мог найти ничего об этом). Я сейчас в конце своих знаний (я только начинал с JavaFX и имел базовые знания Java), и мне кажется, что я занимаюсь этой темой с неправильной стороны.

Мой вопрос сейчас: что было бы лучше всего обрабатывать десятки флажков и запускать логику в коде в соответствии с полем, которое было проверено без написания ChangeListener для каждой проверки, оставляя меня с некоторым (imo) уродливым код полностью.

EDIT: Я забыл упомянуть: я действительно достиг своего рода функционального решения, написав пользовательский CheckboxChangeListener со ссылкой на элемент, на который был вызван метод addListener, и используя «getId()» в этой ссылке. Я узнал, что этот метод ссылается на css: id элемента fxml, а не на его fx: id, и я не совсем уверен, что это правильный путь.

ответ

0

Вы должны изучить привязку данных с помощью javafx. Например:

CheckBox cb1 = new CheckBox("1"); 
    CheckBox cb2 = new CheckBox("2"); 

    BooleanProperty isCb1Selected = cb1.selectedProperty(); 
    BooleanProperty isCb2Selected = cb2.selectedProperty(); 

    Textfield foo = new TextField().visibleProperty().bind(isCb1Selected.and(isCb2Selected)); 

Это скроет текстовое поле foo, если по крайней мере один из этих флажков не выбран.
Другие примеры: here и here an oracle tutorial

+0

Спасибо за ресурсы. Я посмотрю на это. Я надеялся, что смогу работать с каким-то идентификатором (который был резонансом за всем этим материалом fx: id), потому что логика основана на некоторых данных внутри базы данных, которую мне нужно искать. Из-за этого мне нужно идентифицировать флажки индивидуально. Как вы думаете, что это с помощью «текста» флажка является плохой практикой? Я мог бы заменить ID в формате «1_1» и т. Д. Фактическим текстом флажка и проверить его с помощью «getText()», правильно? – OberstK

+0

Внесение идентификатора в текст было бы плохой практикой, но до тех пор, пока оно работает, и пользователь не раздражается, почему бы и нет? Но я не понимаю, зачем вам это нужно. Допустим, вы указали флажок fx: id 'cb1_1', после чего вы можете ввести его в ваш контроллер с помощью' @FXML Checkbox cb1_1' и использовать привязку, которую я показал вам для условий (так что вам не нужны первые два строки моего примера). – haisi

+0

Ах! Теперь я понял, что вы имели в виду! Это на самом деле то, как я это делаю прямо сейчас. Чтобы проверить логические правила флажка, я использую getId() в флажке, в результате получается «cb1_1» и проверяет это на базе базы данных, чтобы получить логику. Я просто не был уверен, что это путь, потому что, поскольку я знаю, что использование «getId()» не должно использоваться для этой цели. Я не был уверен, хотя и хотел проверить мой мыслительный процесс. – OberstK

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