属性“样式”不存在或是只读的

时间:2015-12-10 13:14:49

标签: java javafx

我在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的选择框中添加样式。

非常感谢所有人..

1 个答案:

答案 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;
    }

}

CellFactory

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());
                }
            }

        };
    }

}

FXML

确保导入相关类(StyledStringStyledListCellsFactory

<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属性设置为其他内容))