How can I add a tooltip to a node that does not implement Control using FXML?

前提是你 提交于 2020-05-14 18:00:45

问题


In JavaFX subclasses of Control have a tooltip property which means that one can declaratively add a Tooltip using FXML thusly:

<CheckBox fx:id="someCheckBox" mnemonicParsing="false" text="Do It?">
    <tooltip>
        <Tooltip text="Whether or not to do it."/>
    </tooltip>
</CheckBox>

This is possible only because CheckBox is a subclass of Control.

However, I would like to be able to add a tooltip to any scene-graph Node using FXML (i.e. without having to programatically add the tooltip using Java).


回答1:


There is an archived discussion on the Oracle Community Forum that suggests wrapping the Node inside of a ScrollPane and setting the Tooltip on the ScrollPane. This is less than ideal though as it adds an unnecessary Node to the scene-graph but more importantly does not work well in all scenarios. Consider trying to add a Tooltip to the graphic of a TitledPane:

<TitledPane text="My TitledPane" fx:id="someTitledPane" expanded="true" contentDisplay="RIGHT">
    <graphic>
        <ScrollPane fitToWidth="true" fitToHeight="true" style="-fx-background-color: rgba(255, 255, 255, 0);">
            <ImageView fitWidth="24.0" fitHeight="24.0" preserveRatio="true" pickOnBounds="true">
            <image>
                <Image url="/images/questionMark.jpg" />
            </image>
            </ImageView>
        <tooltip>
            <Tooltip text="My tooltip."/>
        </tooltip>
        </ScrollPane>
    </graphic>
    <Label text="Hello!"/>
</TitledPane>

Even though the ScrollPane has a transparent background, there is still a visible white-box behind the question mark graphic:

There is a way around this, and that is to utilize the power of <fx:script>:

<?language javascript?>

<TitledPane text="My TitledPane" fx:id="someTitledPane" expanded="true" contentDisplay="RIGHT">
    <graphic>
        <ImageView fx:id="questionMarkImageView" fitWidth="24.0" fitHeight="24.0" preserveRatio="true" pickOnBounds="true">
        <image>
            <Image url="/images/questionMark.jpg" />
        </image>
        </ImageView>
        <fx:script>
            var tooltip = new javafx.scene.control.Tooltip('My tooltip');
            javafx.scene.control.Tooltip.install(questionMarkImageView, tooltip);
        </fx:script>
    </graphic>
    <Label text="Hello!"/>
</TitledPane>

Note that the fx:id of the ImageView is referenced inside of the script (I did not see this functionality documented anywhere and only found it through experimentation - which in fact prompted me to post this Q&A in the hope that others would find it useful). The results look like:



来源:https://stackoverflow.com/questions/36950542/how-can-i-add-a-tooltip-to-a-node-that-does-not-implement-control-using-fxml

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!