2016-06-29 26 views
2

Das folgende Programm ist ein Beispiel dafür, was ich eigentlich erreichen möchte. enter image description hereWie mache ich Inhalt in einer JavaFX-Szene transparent?

Ich versuche zu tun, ist das Bild oben in JavaFX neu erstellen. Allerdings habe ich Schwierigkeiten, denn wenn ich den Inhalt meiner Bühne transparent mache, wird er nicht transparent, sondern weiß bleiben.

@Override 
public void start(Stage stage) {   
    try { 
     BorderPane root = new BorderPane(); 

     Scene scene = new Scene(root,400,400); 

     root.setStyle("-fx-background-color: rgba(0,0,0,0);"); 

     scene.setFill(Color.TRANSPARENT); 

     stage.setScene(scene); 
     stage.show(); 
    } catch(Exception e) { 
     e.printStackTrace(); 
    } 
} 

Die Bühne ist von diesem Code aus sichtbar. Außerdem habe ich den Inhalt transparent gemacht und den Standardstil des Hauptfensters in transparent geändert.

Ich verstehe nicht, warum das nicht funktioniert, ich setze den Inhalt transparent, aber der Hintergrund ist immer noch nicht transparent.

Das Ergebnis aus dem Code, den ich gepostet habe, zeigt dies, wie Sie sehen können, ist es nicht transparent.

enter image description here

+0

Sie müssen sicherstellen, dass der übergeordnete Knoten (und alle relevanten untergeordneten Knoten) Ihrer Szene sowie die Bühne selbst transparent sind. Ich bin mir nicht sicher, wie ich das auf der Bühne machen soll, ganz oben auf meinem Kopf. – ManoDestra

+0

Aber wenn die Bühne transparent ist, kannst du die Bühne nicht sehen. Auch du kannst die Bühne nicht bewegen. –

+0

Ja. Ich bin mir nicht sicher, ob das, was Sie in Ihrem Bild erreichen wollen (den Hintergrund der Bühne transparent einzustellen) tatsächlich möglich ist. Fasziniert. Ein Blick darauf :) – ManoDestra

Antwort

3

Diese Frage ist fast ein Duplikat:

Der Unterschied ist, dass es auch die native Fensterdekorationen zu behalten fragt, was mit StageStyle.TRANSPARENT nicht möglich ist, .

Wenn Sie sich die in der Frage angegebenen Beispielfenster genau ansehen, unterscheiden sich die Dekorationsbereiche leicht (z. B. enthält eines ein Bühnensymbol oben links und das andere nicht). Meine Vermutung ist, dass das transparente Fenster, das in der Frage dargestellt wird, die OS-Fensterdekorationen überhaupt nicht verwendet, sondern stattdessen seine eigenen Dekorationen rendert, die der OS-Fensterdekoration sehr ähnlich sehen (das ist nur eine Vermutung).

Wie auch immer, um einen ähnlichen Effekt mit JavaFX zu erzielen, ist es notwendig, dass JavaFX verwendet wird, um die Fensterdekorationen und nicht den OS Window Manager zu rendern. Um dies zu erreichen, beziehen sich auf die folgende Frage:

Insbesondere bei der Undecorator Bibliothek einen Blick:

Sie werden es nie sein In der Lage, die Fensterdekorationen genau mit den Dekorationen des OS Window Managers zu vergleichen, aber Sie können cre aß etwas, das anders aussieht und ähnliche Funktionen bietet. Wenn Sie daran arbeiten, können Sie möglicherweise etwas erreichen, das mit den Fensterdekorationen des Betriebssystems übereinstimmt, ähnlich dem Fenster-Screenshot in Ihrer Frage. Wenn ich es wäre, würde ich einfach ein anderes Aussehen wählen, das vom Benutzer immer noch sauber und leicht verständlich ist, ähnlich dem Standard-Look von Undecorator.

Glaubst du, dass dies durch Erstellen einer ImageView und Verwendung einer Art Bühnen-Listener erzeugt werden kann, wenn die Bühne verschoben wird, zeigt die Bildansicht ein neues Bild dessen, was hinter der Anwendung steckt. Oder macht es das zu kompliziert?

Die Hintergrunderfassung für den imageView-Ansatz ist ein vernünftiger alternativer Ansatz.

Wenn Sie den Imageview-Capture-Ansatz verwenden wollen, können Sie einige der Ideen aus der folgenden Antwort verwenden:

Beachten Sie, dass die Imageview-Capture-Typ Antwort oben gewonnen verknüpft erfülle nicht vollständig, was du dir wünschst, und du musst noch einige zusätzliche benutzerdefinierte Arbeiten ausführen, um genau den Effekt zu erzielen, den du brauchst, wenn du die Bühne bewegst oder wenn sich der Desktop oder die Fenster unter deinem Fenster ändern. Möglicherweise müssen Sie möglicherweise auf Logik außerhalb von JavaFX zurückgreifen, um Ihr Ziel vollständig zu erreichen, und die Diskussion darüber, wie dies zu tun ist, liegt außerhalb des Bereichs dessen, was ich hier vorbereiten würde (oder kann).

Es ist kompliziert, egal was Sie tun, ich habe nicht wirklich eine Empfehlung zwischen dem Undecorator oder dem ImageView Capture-Ansatz.


Vielleicht, wenn Sie JavaFX mischen und Swing/AWT können Sie in der Lage sein, dies zu tun, indem Sie einen JFXPanel und die AWT PERPIXEL_TRANSPARENT Funktion. Ich habe diese Kombination nicht ausprobiert, aber pro Pixel Einstellungen für AWT sind in this oracle sample wie in How to Implement Per-Pixel Translucency diskutiert.

+0

Sorry mein Titel war irgendwie irreführend, ich wollte die Szene nicht Bühne sagen. Das Fenster ist mir egal, ich möchte nur, dass der Inhalt der Szene wie auf dem Bild transparent ist. –

+1

Ja, ich verstehe das (zumindest glaube ich das ;-) und das habe ich versucht zu beantworten. Wahrscheinlich war meine Antwort nicht klar, aber du kannst es nicht direkt machen, du kannst nur transparente Bühnen ohne Dekorationen haben. Wenn Sie Transparenz und Dekorationen wünschen, müssen Sie die Dekorationen selbst rendern. – jewelsea

+0

Glaubst du, dass dies durch Erstellen einer ImageView und Verwendung einer Art Bühnen-Listener erreicht werden kann, wenn die Bühne verschoben wird, zeigt die Bildansicht ein neues Bild dessen, was hinter der Anwendung steckt. Oder macht es das zu kompliziert? –