如何在JavaFX中突出显示一个窗口?

时间:2015-11-24 16:50:10

标签: java css javafx-8

我正在使用JavaFX拖放文件导入,并且我希望整个窗口(客户端区域)在用户拖动文件时突出显示蓝色。我知道如何使用JavaFX输入API和CSS很好,但不知道一个简单的方法来做到这一点。是否可以在窗口上放置一个掩码,或者我只需要更改根和每个节点的背景颜色?我想要这样的东西(Mac窗口截图突出显示):

enter image description here

1 个答案:

答案 0 :(得分:3)

您可以创建一个适当样式的Region,使其不受管理,鼠标透明,并将其添加到根窗格。如果需要,请观察根窗格的边界并调整区域大小以填充它。

这是一个SSCCE:

import javafx.application.Application;
import javafx.beans.value.ChangeListener;
import javafx.geometry.Bounds;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Region;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class HighlightWholeWindow extends Application {

    @Override
    public void start(Stage primaryStage) {

        Region mask = createMask();
        ToggleButton highlightButton = new ToggleButton("Highlight");
        highlightButton.selectedProperty().addListener((obs, wasHighlighted, isNowHighlighted) -> {
            Pane root = (Pane)highlightButton.getScene().getRoot();
            if (isNowHighlighted) {
                root.getChildren().add(mask);
            } else {
                root.getChildren().remove(mask);
            }
        });

        VBox root = new VBox(highlightButton);
        root.setAlignment(Pos.CENTER);
        Scene scene = new Scene(root, 400, 400);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private Region createMask() {
        Region mask = new Region();

        // in real life, use an external style sheet:
        mask.setStyle("-fx-background-color: #6495ed80;");

        mask.setManaged(false);
        mask.setMouseTransparent(true);
        mask.setLayoutX(0);
        mask.setLayoutY(0);

        ChangeListener<Bounds> boundsListener = (obs, oldBounds, newBounds) -> 
            mask.resizeRelocate(newBounds.getMinX(), newBounds.getMinY(),
                                newBounds.getWidth(), newBounds.getHeight());

        mask.parentProperty().addListener((obs, oldParent, newParent) -> {
            if (oldParent != null) {
                oldParent.boundsInLocalProperty().removeListener(boundsListener);
            }
            if (newParent != null) {
                Bounds newParentBounds = newParent.getBoundsInLocal() ;
                mask.resizeRelocate(newParentBounds.getMinX(), newParentBounds.getMinY(), 
                                    newParentBounds.getWidth(), newParentBounds.getHeight());
                newParent.boundsInLocalProperty().addListener(boundsListener);
            }
        });

        return mask ;
    }


    public static void main(String[] args) {
        launch(args);
    }
}

显然你可以调整它来响应拖动处理程序而不是切换按钮。

enter image description here

enter image description here