2016-04-30 9 views
4

In JavaFX Subklassen von Control haben eine Tooltip Eigenschaft, die bedeutet, dass man deklarativ einen Tooltip mit FXML thusly hinzufügen:Wie kann ich einen Tooltip zu einem Knoten hinzufügen, der Control nicht mit FXML implementiert?

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

Dies ist nur möglich, weil CheckBox ist eine Unterklasse der Kontrolle.

Ich würde jedoch gerne in der Lage sein, einen Tooltip zu jedem Szene-Graph-Knoten hinzuzufügen, der FXML verwendet (d. H. Ohne den Tooltip mit Java programmatisch hinzufügen zu müssen).

Antwort

3

Es gibt eine archived discussion im Oracle Community Forum, die schlägt vor, die Node innerhalb einer ScrollPane zu verpacken und den Tooltip auf dem ScrollPane zu setzen. Dies ist jedoch weniger als ideal, da es dem Szenegraphen einen unnötigen Knoten hinzufügt, aber noch wichtiger ist, dass es nicht in allen Szenarien gut funktioniert. Betrachten Sie versuchen, ein Tooltip auf die Grafik eines TitledPane hinzuzufügen:

<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> 

Auch wenn die ScrollPane einen transparenten Hintergrund hat, gibt es noch eine sichtbare White-Box hinter dem Fragezeichen Grafik:

ScrollPane leaves white background - not ideal!

Es gibt einen Weg, um dieses, und das ist die Macht der <fx:script> zu nutzen:

<?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> 

Beachten Sie, dass die fx:id der ImageView innerhalb des Skripts referenziert wird (ich habe diese Funktionalität nirgends dokumentiert und nur durch Experimente gefunden - was mich tatsächlich dazu veranlasste, dieses Q & A in der Hoffnung zu veröffentlichen, dass andere es nützlich finden würden). Die Ergebnisse sehen so aus:

No white background and one less node in scene-graph - ideal!