当鼠标悬停在 JavaFX 中的按钮上时如何创建节点(圆)?

How to create a node (Circle) while the mouse is hovering over a button in JavaFX?

我有一个 FXML 文件,还有一个 CSS 文件和一个 Controller.java 文件。当鼠标悬停在 FXML 文件中的按钮上时,

例如fx:id="load"

如何在舞台上创建圆形节点?

我目前正在这样做:

注意:FXML 和 Controller 是链接的,所有导入都已计算在内。

// FXML:

<Button fx:id="load" layoutX="146.0" layoutY="307.0" mnemonicParsing="false"\
onMouseEntered="#hoverEnterLoad" onMouseExited="#hoverExitLoad"\
prefHeight="26.0" prefWidth="93.0" stylesheets="@title.css" />

// Controller:

public Controller {

    @FXML private Button load;
    private Circle choose = new Circle(210.0, 278.0, 15.0, Color.TRANSPARENT);

    /**                                                                                                                                                                              
     * Shows circle                                                                                                                                                                
     */
    @FXML void hoverEnterLoad(ActionEvent event) {
        choose.setCenterX(210.0);
        choose.setCenterY(278.0);
        choose.setFill(Color.BLACK);
        choose.setRadius(15.0);
    } // hoverEnterLoad                                                                                                                                                               

    /**                                                                                                                                                                              
     * Hides circle                                                                                                                                                                
     */
    @FXML void hoverExitLoad(ActionEvent event) {
        choose.setFill(Color.TRANSPARENT);
    } // hoverExitLoad

} // Controller

我想通了。

在 FXML 中添加一个透明的 Circle 并通过 Controller.java 编辑它而不是创建一个新的。

// FXML:
// Added:

<Circle fx:id="selector" centerX="255.0" centerY="291.0" fill="TRANSPARENT" radius="5.0" stroke="TRANSPARENT" strokeType="INSIDE" />

// Controller:
// Added/Updated:

public Controller {

    @FXML private Button load;
    @FXML private Circle choose;

    /**                                                                                                                                                                              
     * Shows circle                                                                                                                                                                
     */
    @FXML void hoverEnterLoad(ActionEvent event) {
        choose.setCenterX(210.0);
        choose.setCenterY(278.0);
        choose.setFill(Color.BLACK);
        choose.setRadius(15.0);
    } // hoverEnterLoad                                                                                                                                                               

    /**                                                                                                                                                                              
     * Hides circle                                                                                                                                                                
     */
    @FXML void hoverExitLoad(ActionEvent event) {
        choose.setFill(Color.TRANSPARENT);
    } // hoverExitLoad

} // Controller

您完全可以在 FXML 中执行此操作:

<Button fx:id="load" layoutX="146.0" layoutY="307.0" mnemonicParsing="false"\
onMouseEntered="#hoverEnterLoad" onMouseExited="#hoverExitLoad"\
prefHeight="26.0" prefWidth="93.0" stylesheets="@title.css" />
<Circle fx:id="selector" centerX="255.0" centerY="291.0" fill="BLACK" radius="5.0" stroke="TRANSPARENT" strokeType="INSIDE" visible="${load.hover}" />

为什么不直接使用 Button 的给定 hoverProperty?

circle.visibleProperty().bind(button.hoverProperty());

这可能更好。特别是如果你要添加大量的圈子。

public class FXMLDocumentController implements Initializable {

    @FXML private AnchorPane apMain;
    @FXML private Button load;
    Circle choose;




    @FXML void hoverEnterLoad(MouseEvent event) {
        choose = new Circle();
        choose.setCenterX(50.0);
        choose.setCenterY(50.0);
        choose.setFill(Color.BLACK);
        choose.setRadius(15.0);
        apMain.getChildren().add(choose);
        System.out.println("Mouse over button!");
    } // hoverEnterLoad                                                                                                                                                               

    /**                                                                                                                                                                              
     * Hides circle                                                                                                                                                                
     */
    @FXML void hoverExitLoad(MouseEvent event) {
        apMain.getChildren().remove(choose);
        System.out.println("Mouse no longer over!");
    } // hoverExitLoad

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
    }    

}