2015-11-24 25 views
1

我正在使用JavaFX拖放文件導入功能,並且我希望整個窗口(客戶端區域)在用戶將文件拖過文件時突出顯示藍色。我知道如何使用JavaFX輸入API和CSS,但不知道一個簡單的方法來做到這一點。是否有可能在窗口上放置遮罩,還是隻需要更改根目錄和每個節點的背景顏色?我想是這樣的(Mac的窗口截圖高亮):如何突出顯示JavaFX中的窗口?

enter image description here

回答

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

相關問題