什么是处理JavaFX中很多复选框的好习惯

问题描述:

我需要构建一个包含4层嵌套多重手风琴的视图,其中包含很多复选框。所有在一起可能会有大约30-40个复选框通过手风琴。什么是处理JavaFX中很多复选框的好习惯

下一步将是,我有这种背后的某种逻辑。根据复选框的选择组合,我将相应地更改文本标签。

我的思考过程是:我把所有这些复选框都给了他们一个数字fx:id代表嵌套的手风琴图中的位置。像“1_1”或“2_4_1”。 之后,我构建了一个ChangeListener,它调用一个方法来选择一个复选框。我可以查看复选框的ID,在数据中查找它(查看哪些文本属于它,以及是否有任何规则干扰其他框),并在将ID及其文本放入Map中时相应地处理逻辑或列出以备后用,并跟踪选中的框。

现在我才知道,获得fx:id并不是JavaFX希望我做的事情。我不能在FXML中的自定义属性中提供自定义ID(无法找到任何关于此的)。 我现在已经非常熟悉我的知识了(我刚刚开始使用JavaFX,并具有一些基本的Java知识),在我看来,我从错误的角度解决了这个问题。

我现在的问题是:什么是最好的做法来处理代码中的几十个复选框和触发器逻辑,根据没有为每个复选框写入ChangeListener而被选中的框,留下一些(imo)丑陋一路代码。

编辑:我忘了提及:我通过编写自定义CheckboxChangeListener来实现某种功能解决方案,并引用了addListener方法被调用的元素,并在此引用上使用“getId()”。然而我知道,这个方法引用了fxml元素的css:id,而不是它的fx:id,我不太确定这是否是一种正确的方式。

你应该考虑用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)); 

如果至少有一个复选框未被选中,这将隐藏textfield foo。
你可以找到其他的例子herehere an oracle tutorial

+0

谢谢你的来源。我会看看它。我希望能够使用某种标识符(这是所有fx:id背后的共同点),因为逻辑基于我需要查看的数据库中的某些数据。正因为如此,我需要确定个人复选框。 你是否认为通过复选框的“文本”来做到这一点是一个不好的做法?我可以用“1_1”等格式替换复选框的实际文本,并通过“getText()”进行检查,对吧? – OberstK 2014-10-09 10:33:29

+0

将ID作为文本将是不好的做法,但只要它有效并且用户不会感到恼火,为什么不呢?但我不明白你为什么需要它。假设你给了一个复选框“cb1_1”的fx:id,那么你可以通过'@FXML Checkbox cb1_1'将它注入到你的控制器中,并使用我向你显示条件的绑定(所以你不需要前两个我的例子中的线)。 – haisi 2014-10-09 10:55:14

+0

啊!现在我明白你的意思了!这实际上就是我现在这样做的方式。要查看复选框的逻辑规则,我在复选框上使用getId(),导致“cb1_1”,并根据数据库检查它以获取它背后的逻辑。我只是不确定这是否要走,因为我知道使用“getId()”不应该用于此目的。我不确定,但想要检查我的思维过程。 – OberstK 2014-10-09 10:58:19