我有以下Java代码:

@DefaultProperty("strings")
public class CustomControl extends HBox {
 ChoiceBox<String> choiceBox = new ChoiceBox();
 public ObservableList<String> getStrings() {
  return choiceBox.getItems();
 }
}


以及以下FXML代码:

<CustomControl>
  <String fx:value="value1" />
  <String fx:value="value2" />
</CustomControl>


效果很好,但是如果我将FXML代码替换为以下FXML代码,它将无法正常工作:

<fx:define>
 <FXCollections fx:factory="observableArrayList" fx:id="collection">
  <String fx:value="value1" />
  <String fx:value="value2" />
 </FXCollections>
</fx:define>
...
<CustomControl>
 <fx:reference source="collection" />
</CustomControl>


运行此命令时,出现以下错误类型:

Unable to coerce [value1, value2] to class String.


我理解该错误(当我确实希望将列表中的每个项目都添加到“字符串” bean中时,它认为我想将整个字符串列表放入“字符串” bean的第一个元素中),但是我不知道该怎么做我想做的事。
这个想法是,我试图在fxml文件的开头定义一个项目列表,以便我可以在fxml文件的其他部分多次引用该列表。我不知道列表中有多少个项目,所以我不想给每个项目提供自己的ID。如何在不获取父元素的情况下引用元素序列?还是有一些更好的方法来做到这一点?

最佳答案

在代码的第一个版本中,如果将fx:id赋予CustomControl

<CustomControl fx:id="customControl">
  <String fx:value="value1" />
  <String fx:value="value2" />
</CustomControl>


那么您应该能够在FXML文件中的其他位置引用该列表,

${customControl.strings}


作为属性值,或

<fx:reference source="customControl.strings"/>


作为一个元素。

另外,我认为如果您在setStrings(...)类中定义CustomControl方法,则第二种方法可以工作,例如:

@DefaultProperty("strings")
public class CustomControl extends HBox {
 ChoiceBox<String> choiceBox = new ChoiceBox();
 public ObservableList<String> getStrings() {
  return stringsProperty().get();
 }
 public void setStrings(ObservableList<String> strings) {
  stringsProperty().set(strings);
 }
 public ObjectProperty<ObservableList<String>> stringsProperty() {
  return choiceBox.itemsProperty();
 }
}


在此版本中,DefaultProperty似乎不尊重setStrings(...)方法,但是如果您明确指定该属性,它将起作用:

<fx:define>
 <FXCollections fx:factory="observableArrayList" fx:id="collection">
  <String fx:value="value1" />
  <String fx:value="value2" />
 </FXCollections>
</fx:define>
...
<CustomControl>
 <strings>
  <fx:reference source="collection" />
 </strings>
</CustomControl>

关于java - 引用Java FXML中定义的集合,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32080563/

10-12 13:10