我在JavaFX8中遇到选择框的问题。一旦我使用上面的代码,它就可以正常工作了下拉列表。
<ChoiceBox fx:id="messageChoiceBox" maxWidth="-Infinity" minWidth="-Infinity" prefHeight="25.0" prefWidth="24.0" xmlns:fx="http://javafx.com/fxml">
<items>
<FXCollections fx:factory="observableArrayList">
<String fx:value="Inbox" style="-fx-background-image: url('file:resources/images/message/draft.png');" />
<String fx:value="Facebook" />
<String fx:value="Orkut" />
<String fx:value="LinkedIn" />
<String fx:value="Google Plus" />
</FXCollections>
</items>
<HBox.margin>
<Insets right="40.0" top="3.0" />
</HBox.margin>
</ChoiceBox>
但我的问题是,我还需要为每个fx:value
使用图像<String fx:value="Facebook" style="-fx-background-image: url('myPath/facebook.png');" />
<String fx:value="Orkut" style="-fx-background-image: url('myPath/Orkut.png');" />
<String fx:value="LinkedIn" style="-fx-background-image: url('myPath/LinkedIn.png');" />
<String fx:value="Google Plus" style="-fx-background-image: url('myPath/Google Plus.png');" />
一旦我运行此错误..
Caused by: com.sun.javafx.fxml.PropertyNotFoundException: Property "style" does not exist or is read-only.
at javafx.fxml.FXMLLoader$Element.processValue(Unknown Source)
at javafx.fxml.FXMLLoader$Element.processPropertyAttribute(Unknown Source)...
有谁知道如何解决这个问题?让我知道 有没有办法在FXML的选择框中添加样式。
非常感谢所有人..
答案 0 :(得分:1)
由于java.lang.String
没有提供样式属性,因此您必须使用自己的包含值和样式的类。
请注意,ChoiceBox
不支持样式项,因此我建议使用ComboBox
代替自定义单元格工厂:
public class StyledString {
private final String value;
private final String style;
// allows creating instances from fxml with given value and style
public StyledString(@NamedArg("value") String value, @NamedArg("style") String style) {
this.value = value;
this.style = style;
}
public String getValue() {
return value;
}
public String getStyle() {
return style;
}
}
public class StyledListCellsFactory implements Callback<ListView<StyledString>, ListCell<StyledString>> {
@Override
public ListCell<StyledString> call(ListView<StyledString> param) {
return new ListCell<StyledString>() {
@Override
protected void updateItem(StyledString item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty) {
setText(null);
setStyle(null);
} else {
setText(item.getValue());
setStyle(item.getStyle());
}
}
};
}
}
确保导入相关类(StyledString
和StyledListCellsFactory
)
<ComboBox fx:id="messageChoiceBox" maxWidth="-Infinity" minWidth="-Infinity" prefHeight="25.0" prefWidth="24.0" xmlns:fx="http://javafx.com/fxml">
<cellFactory>
<StyledListCellsFactory/>
</cellFactory>
<items>
<FXCollections fx:factory="observableArrayList">
<StyledString value="Inbox" style="-fx-background-image: url('file:resources/images/ib.png');" />
<StyledString value="Facebook" style="-fx-background-image: url('file:resources/images/fb.png');" />
<StyledString value="Orkut" style="-fx-background-image: url('file:resources/images/index.jpg');" />
<StyledString value="LinkedIn" />
<StyledString value="Google Plus" />
</FXCollections>
</items>
<HBox.margin>
<Insets right="40.0" top="3.0" />
</HBox.margin>
</ComboBox>
但是,如果它始终是您使用的图像,请考虑使用图像网址而不是样式。你仍然可以使用url构造样式字符串,你也可以使用单元格工厂将图像显示为graphic
(有关graphic
属性的示例用法,请参阅ComboBox javadoc(矩形)可以用ImageView
替换,并将contentDisplay
属性设置为其他内容))