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

时间:2015-03-03 21:05:42

标签: java javafx controller javafx-8 fxml

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

e.g。 fx:id="load"

如何在舞台上创建Circle节点?

我目前正在这样做:

注意: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

4 个答案:

答案 0 :(得分:1)

您可以完全使用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}" />

答案 1 :(得分:0)

我明白了。

在FXML中添加透明圆圈,并通过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

答案 2 :(得分:0)

为什么不使用按钮的给定hoverProperty?

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

答案 3 :(得分:0)

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

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
    }    

}