我正在使用JavaFX拖放文件导入,并且我希望整个窗口(客户端区域)在用户拖动文件时突出显示蓝色。我知道如何使用JavaFX输入API和CSS很好,但不知道一个简单的方法来做到这一点。是否可以在窗口上放置一个掩码,或者我只需要更改根和每个节点的背景颜色?我想要这样的东西(Mac窗口截图突出显示):
答案 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);
}
}
显然你可以调整它来响应拖动处理程序而不是切换按钮。