2016-06-09 11 views
3

Ich versuche, etwas wie Modal Popus in meiner Anwendung zu implementieren. Um sie klarer zu machen, beschloss ich, das ganze Fenster zu verwischen und Popus davor zu platzieren.JavaFX verwischen ganzes Fenster

Das Problem ist, dass JavaFX Verwischung Artefakte erzeugt, wenn ein ganzes Fenster angewandt:

alt

Hinweis eines weißer Rand - es sollte nicht existieren.


Mein Code ist:

public void enableBlur() { 
    ColorAdjust adj = new ColorAdjust(0, -0.9, -0.5, 0); 
    GaussianBlur blur = new GaussianBlur(55); // 55 is just to show edge effect more clearly. 
    adj.setInput(blur) 
    rootPanel.setEffect(adj); 
} 

So ist der Effekt angewendet wird Content-Panel zu verankern.


P.S. Die Frage ist kein Duplikat von this, da ich denke, dass die gelieferte Lösung unter dem gleichen Kanteneffekt leidet, aber es ist nicht so deutlich sichtbar, weil der Inhalt der Form nicht so dunkel ist wie hier.

+1

Mögliches Duplikat [Mattglas-Effekt in JavaFX?] (Http://stackoverflow.com/questions/22622034/frosted-glass-effect-in-javafx) – Itai

+0

Ich versuchte, einen Schnappschuss zu nehmen und dann eine Unschärfe Schnappschuss. Aber es funktioniert nicht. Auch ich denke, dass Kanteneffekt auch in dieser Lösung vorhanden ist. Es ist jedoch subtiler, da der Hintergrund hell ist und der Randeffekt weiß ist. – Maxim

Antwort

5

Setzen Sie die fill der Scene auf die Hintergrundfarbe.

Im folgenden Beispiel können Sie zwischen keiner Füllung (null) und der Hintergrundfarbe (Color.BLACK) wechseln (wenn Sie den Knopf durch diesen Unschärfeeffekt finden).

@Override 
public void start(Stage primaryStage) { 
    Button btn = new Button("If you can read this, the blur isn't working!"); 

    StackPane root = new StackPane(); 
    root.getChildren().add(btn); 
    root.setStyle("-fx-background-color: black;"); 
    ColorAdjust adj = new ColorAdjust(0, -0.9, -0.5, 0); 
    GaussianBlur blur = new GaussianBlur(55); // 55 is just to show edge effect more clearly. 
    adj.setInput(blur); 
    root.setEffect(adj); 

    Scene scene = new Scene(root, 500, 200, null); 

    btn.setOnAction((ActionEvent event) -> { 
     scene.setFill(scene.getFill() == Color.BLACK ? null : Color.BLACK); 
    }); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
}