1
我正在使用JavaFX拖放文件導入功能,並且我希望整個窗口(客戶端區域)在用戶將文件拖過文件時突出顯示藍色。我知道如何使用JavaFX輸入API和CSS,但不知道一個簡單的方法來做到這一點。是否有可能在窗口上放置遮罩,還是隻需要更改根目錄和每個節點的背景顏色?我想是這樣的(Mac的窗口截圖高亮):如何突出顯示JavaFX中的窗口?
我正在使用JavaFX拖放文件導入功能,並且我希望整個窗口(客戶端區域)在用戶將文件拖過文件時突出顯示藍色。我知道如何使用JavaFX輸入API和CSS,但不知道一個簡單的方法來做到這一點。是否有可能在窗口上放置遮罩,還是隻需要更改根目錄和每個節點的背景顏色?我想是這樣的(Mac的窗口截圖高亮):如何突出顯示JavaFX中的窗口?
您只需創建一個適當的風格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);
}
}
很明顯,你可以適應這個迴應拖,而不是切換按鈕的處理程序。