Javafx 如何通过在FXML中悬停调用方法?

Javafx 如何通过在FXML中悬停调用方法?,javafx,hover,fxml,Javafx,Hover,Fxml,我正在开发一个程序,当我将鼠标悬停在连接两个图像的按钮上时,我需要将两个图像涂成红色。问题是,我需要在鼠标悬停时执行此操作,而不是在用户单击按钮时。 我正在使用FXML和css进行样式设置,但我看不到任何方法可以从css的:hover中调用方法 在控制器中,您可以执行以下操作 private final PseudoClass highlightImage = PseudoClass.getPseudoClass("highlight"); @FXML private Node someNod

我正在开发一个程序,当我将鼠标悬停在连接两个图像的按钮上时,我需要将两个图像涂成红色。问题是,我需要在鼠标悬停时执行此操作,而不是在用户单击按钮时。
我正在使用FXML和css进行样式设置,但我看不到任何方法可以从css的:hover中调用方法

在控制器中,您可以执行以下操作

private final PseudoClass highlightImage = PseudoClass.getPseudoClass("highlight");

@FXML
private Node someNode1 ;
@FXML
private Node someNode2 ;
@FXML
private Button button ;

public void initialize() {
    button.hoverProperty().addListener((obs, wasHovered, isNowHovered) -> {
        someNode1.pseudoClassStateChanged(highlightImage, isNowHovered);
        someNode2.pseudoClassStateChanged(highlightImage, isNowHovered);
    });
}
然后在CSS中,您可以执行以下操作

private final PseudoClass highlightImage = PseudoClass.getPseudoClass("highlight");

@FXML
private Node someNode1 ;
@FXML
private Node someNode2 ;
@FXML
private Button button ;

public void initialize() {
    button.hoverProperty().addListener((obs, wasHovered, isNowHovered) -> {
        someNode1.pseudoClassStateChanged(highlightImage, isNowHovered);
        someNode2.pseudoClassStateChanged(highlightImage, isNowHovered);
    });
}
#someNode1、#someNode2{
//常规样式
}
#someNode1:突出显示,#someNode2:突出显示{
//悬停样式
}

以下是SSCCE:

import javafx.css.PseudoClass;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.shape.Rectangle;

public class HighlightOnHoverController {

    @FXML
    private Rectangle leftRect ;
    @FXML
    private Rectangle rightRect ;
    @FXML
    private Button button ;

    private final PseudoClass highlightRect = PseudoClass.getPseudoClass("highlight");

    public void initialize() {
        button.hoverProperty().addListener((obs, wasHovered, isNowHovered) -> {
            leftRect.pseudoClassStateChanged(highlightRect, isNowHovered);
            rightRect.pseudoClassStateChanged(highlightRect, isNowHovered);
        });
    }

    @FXML
    private void click() {
        System.out.println("Button clicked");
    }
}
HighlightOnHover.fxml:


highlight-on-hover.css:

.rect{
-fx填充:矢车菊蓝;
}
.rect:突出显示{
-外汇填料:珊瑚;
}
HighlightOnHover.java:

import java.io.IOException;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class HighlightOnHover extends Application {

    @Override
    public void start(Stage primaryStage) throws IOException {
        Scene scene = new Scene(FXMLLoader.load(getClass().getResource("HighlightOnHover.fxml")));
        scene.getStylesheets().add("highlight-on-hover.css");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
不在按钮上悬停:

将鼠标悬停在按钮上:


在控制器中,您可以执行以下操作

private final PseudoClass highlightImage = PseudoClass.getPseudoClass("highlight");

@FXML
private Node someNode1 ;
@FXML
private Node someNode2 ;
@FXML
private Button button ;

public void initialize() {
    button.hoverProperty().addListener((obs, wasHovered, isNowHovered) -> {
        someNode1.pseudoClassStateChanged(highlightImage, isNowHovered);
        someNode2.pseudoClassStateChanged(highlightImage, isNowHovered);
    });
}
然后在CSS中,您可以执行以下操作

private final PseudoClass highlightImage = PseudoClass.getPseudoClass("highlight");

@FXML
private Node someNode1 ;
@FXML
private Node someNode2 ;
@FXML
private Button button ;

public void initialize() {
    button.hoverProperty().addListener((obs, wasHovered, isNowHovered) -> {
        someNode1.pseudoClassStateChanged(highlightImage, isNowHovered);
        someNode2.pseudoClassStateChanged(highlightImage, isNowHovered);
    });
}
#someNode1、#someNode2{
//常规样式
}
#someNode1:突出显示,#someNode2:突出显示{
//悬停样式
}

以下是SSCCE:

import javafx.css.PseudoClass;
import javafx.fxml.FXML;
import javafx.scene.control.Button;
import javafx.scene.shape.Rectangle;

public class HighlightOnHoverController {

    @FXML
    private Rectangle leftRect ;
    @FXML
    private Rectangle rightRect ;
    @FXML
    private Button button ;

    private final PseudoClass highlightRect = PseudoClass.getPseudoClass("highlight");

    public void initialize() {
        button.hoverProperty().addListener((obs, wasHovered, isNowHovered) -> {
            leftRect.pseudoClassStateChanged(highlightRect, isNowHovered);
            rightRect.pseudoClassStateChanged(highlightRect, isNowHovered);
        });
    }

    @FXML
    private void click() {
        System.out.println("Button clicked");
    }
}
HighlightOnHover.fxml:


highlight-on-hover.css:

.rect{
-fx填充:矢车菊蓝;
}
.rect:突出显示{
-外汇填料:珊瑚;
}
HighlightOnHover.java:

import java.io.IOException;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class HighlightOnHover extends Application {

    @Override
    public void start(Stage primaryStage) throws IOException {
        Scene scene = new Scene(FXMLLoader.load(getClass().getResource("HighlightOnHover.fxml")));
        scene.getStylesheets().add("highlight-on-hover.css");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
不在按钮上悬停:

将鼠标悬停在按钮上:


它工作得非常好!这将需要一些工作,以适应我的计划,但这取决于我!我很感激你,它工作得很好!这将需要一些工作,以适应我的计划,但这取决于我!我感谢你。