2013-07-10 10 views
5

was ist los?Schlagschatten in einem undekorierten Bereich! JAVAFX

Nun, ich versuche, meine Scheibe ein bisschen besser zu machen, visuell, also was ich tue ist: setze meine Bühne UNDECORATED (OK) und (TRYING), um einen Dropshadow-Effekt hinzuzufügen (NICHT OK) .

Ich suchte (A LOT) Fragen wie diese über das Internet, gefunden einige ähnliche Fälle (creating undecorated stage in javafx 2.0 und How to add shadow to window in JavaFX?), aber keiner funktioniert für mich.

Es scheint, als wäre der Schlagschatten JUST nicht gesetzt! Kann nicht verstehen warum.

Sehen Sie, was ich habe:

public static int showConfirmDialog(Window father, String title, String body, String[]  msgBtn) 
{ 
    System.out.println("La vai eu"); 
    AnchorPane ap = createPaneWithButton(2, msgBtn,body); 

    ap.setEffect(initDropShadow()); 
    Scene scene = new Scene(ap); 

    Stage stage = new Stage(); 

    stage.setTitle(title); 

    scene.setFill(null); 
    stage.initStyle(StageStyle.TRANSPARENT); 


    stage.setScene(scene); 
    stage.initStyle(StageStyle.UNDECORATED); 
    stage.show(); 

    return 1; 
} 

private static AnchorPane createPaneWithButton(int qtBtn, String[] msgsBtn, String body) { 
    AnchorPane ap = createPane(); 
    HBox laneBtn = new HBox(30); 
    VBox vbox = new VBox(20); 

    BorderPane layout = new BorderPane(); 

    Button btn; 

    for(int i = 0; i < qtBtn; i++){ 
     btn = new Button(); 
     btn.setText(msgsBtn[i]); 

     laneBtn.getChildren().add(btn); 
    } 

    vbox.getChildren().add(new Text(body)); 
    vbox.getChildren().add(laneBtn); 

    layout.setCenter(vbox); 

    ap.getChildren().add(layout); 

    return ap; 
} 

private static AnchorPane createPane() { 
    AnchorPane ap = new AnchorPane(); 

    ap.setLayoutX(250); 
    ap.setLayoutY(50); 

    return ap; 
} 

Danke Jungs! Ich freue mich auf die Antwort! (Während ich versuche, was ich kann).

PS :. Srry für das Englisch, ist nicht meine Hauptsprache. Ich hoffe du kannst es verstehen.

+1

Zeigen Sie uns initDropShadow(). –

Antwort

11

Prior Beispiel funktioniert für mich

Die example code geliefert für die Antwort auf How to add shadow to window in JavaFX? funktioniert gut für mich (Schlagschatten auf dem Dialog sichtbar) auf Java 8b96, Windows 7. Wenn ich es für JavaFX 2 schrieb, Es funktionierte auch in dieser Umgebung.

Ich konnte nicht genau sagen, was Sie in Ihrem Beispiel fehlen, da Sie keinen vollständigen ausführbaren Code zur Verfügung gestellt haben.

transparent-dialog

mögliches Problem mit Ihrem Code

Meine Vermutung ist, dass Sie nicht den Hintergrund Inhalt insetting so dass es Raum im Dialog für den Schatten dargestellt werden soll. Das heißt, Sie füllen den Dialog mit Inhalt und lassen im Dialog um den Inhalt keinen Raum für den anzuzeigenden Effekt. Das folgende Beispiel erreicht die Einsteckmaschine mit der CSS-Regel -fx-background-insets: 12;

Aktualisiert Beispielcode

ich eine modifizierte Version des Beispielcodes in diese Antwort kopiert, so dass es nicht nur in einem dunklen Kern Link off enthalten ist eine andere Antwort. Die Änderungen dienen lediglich dazu, Standard-API-Aufrufe zu verwenden, da die in der ursprünglichen Antwort verwendeten Builder seit der Erstellung der ursprünglichen Antwort veraltet sind.

ModalConfirmExample.java

import javafx.application.Application; 
import javafx.beans.value.*; 
import javafx.concurrent.Worker; 
import javafx.event.*; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.effect.BoxBlur; 
import javafx.scene.effect.Effect; 
import javafx.scene.layout.*; 
import javafx.scene.paint.Color; 
import javafx.scene.web.WebView; 
import javafx.stage.Modality; 
import javafx.stage.*; 

/** 
* Application modal dialog with the following properties: 
* translucent background 
* drop-shadowed border 
* non-rectangular shape 
* blur effect applied to parent when dialog is showing 
* configurable message text 
* configurable yes and no event handlers 
*/ 
class ModalDialog extends Stage { 
    private static final Effect parentEffect = new BoxBlur(); 

    private final String messageText; 
    private final EventHandler<ActionEvent> yesEventHandler; 
    private final EventHandler<ActionEvent> noEventHandler; 

    public ModalDialog(
      Stage parent, 
      String messageText, 
      EventHandler<ActionEvent> yesEventHandler, 
      EventHandler<ActionEvent> noEventHandler) { 
     super(StageStyle.TRANSPARENT); 

     this.messageText = messageText; 
     this.yesEventHandler = yesEventHandler; 
     this.noEventHandler = noEventHandler; 

     // initialize the dialog 
     initOwner(parent); 
     initParentEffects(parent); 
     initModality(Modality.APPLICATION_MODAL); 
     setScene(createScene(createLayout())); 
    } 

    private StackPane createLayout() { 
     StackPane layout = new StackPane(); 
     layout.getChildren().setAll(
       createGlassPane(), 
       createContentPane() 
     ); 

     return layout; 
    } 

    private Pane createGlassPane() { 
     final Pane glassPane = new Pane(); 
     glassPane.getStyleClass().add(
       "modal-dialog-glass" 
     ); 

     return glassPane; 
    } 

    private Pane createContentPane() { 
     final HBox contentPane = new HBox(); 
     contentPane.getStyleClass().add(
       "modal-dialog-content" 
     ); 
     contentPane.getChildren().setAll(
       new Label(messageText), 
       createYesButton(), 
       createNoButton() 
     ); 

     return contentPane; 
    } 

    private Button createYesButton() { 
     final Button yesButton = new Button("Yes"); 
     yesButton.setDefaultButton(true); 
     yesButton.setOnAction(yesEventHandler); 

     return yesButton; 
    } 

    private Button createNoButton() { 
     final Button noButton = new Button("No"); 
     noButton.setOnAction(noEventHandler); 

     return noButton; 
    } 

    private Scene createScene(StackPane layout) { 
     Scene scene = new Scene(layout, Color.TRANSPARENT); 
     scene.getStylesheets().add(
       getClass().getResource(
         "modal-dialog.css" 
       ).toExternalForm() 
     ); 

     return scene; 
    } 

    private void initParentEffects(final Stage parent) { 
     this.showingProperty().addListener(new ChangeListener<Boolean>() { 
      @Override public void changed(ObservableValue<? extends Boolean> observableValue, Boolean wasShowing, Boolean isShowing) { 
       parent.getScene().getRoot().setEffect(
         isShowing ? parentEffect : null 
       ); 
      } 
     }); 
    } 
} 

/** 
* Demonstrates a modal confirm box in JavaFX. 
* Dialog is rendered upon a blurred background. 
* Dialog is translucent. 
*/ 
public class ModalConfirmExample extends Application { 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(final Stage primaryStage) { 
     final WebView webView = new WebView(); 

     final ModalDialog dialog = createWebViewPreferenceDialog(primaryStage, webView); 

     // show the preference dialog each time a new page is loaded. 
     webView.getEngine().getLoadWorker().stateProperty().addListener(new ChangeListener<Worker.State>() { 
      @Override 
      public void changed(ObservableValue<? extends Worker.State> observableValue, Worker.State state, Worker.State newState) { 
       if (newState.equals(Worker.State.SUCCEEDED)) { 
        dialog.show(); 
        dialog.toFront(); 
       } 
      } 
     }); 
     webView.getEngine().load("http://docs.oracle.com/javafx/"); 

     // initialize the stage 
     primaryStage.setTitle("Modal Confirm Example"); 
     primaryStage.setScene(new Scene(webView)); 
     primaryStage.show(); 
    } 

    private ModalDialog createWebViewPreferenceDialog(final Stage primaryStage, final WebView webView) { 
     final EventHandler<ActionEvent> yesEventHandler = 
       new EventHandler<ActionEvent>() { 
        @Override public void handle(ActionEvent actionEvent) { 
         System.out.println("Liked: " + webView.getEngine().getTitle()); 
         primaryStage.getScene().getRoot().setEffect(null); 
         Stage dialogStage = getTargetStage(actionEvent); 
         dialogStage.close(); 
        } 
       }; 

     final EventHandler<ActionEvent> noEventHandler = 
       new EventHandler<ActionEvent>() { 
        @Override public void handle(ActionEvent actionEvent) { 
         System.out.println("Disliked: " + webView.getEngine().getTitle()); 
         primaryStage.getScene().getRoot().setEffect(null); 
         Stage dialogStage = getTargetStage(actionEvent); 
         dialogStage.close(); 
        } 
       }; 

     return new ModalDialog(primaryStage, "Will you like this Page?", yesEventHandler, noEventHandler); 
    } 

    private Stage getTargetStage(ActionEvent actionEvent) { 
     Node target = (Node) actionEvent.getTarget(); 
     return ((Stage) target.getScene().getWindow()); 
    } 
} 

modal-Dialog.css

.root { 
    -fx-opacity: 0.9; 
} 

.modal-dialog-glass { 
    -fx-effect: dropshadow(three-pass-box, derive(cadetblue, -20%), 10, 0, 4, 4); 
    -fx-background-color: derive(cadetblue, -20%); 
    -fx-background-insets: 12; 
    -fx-background-radius: 6; 
} 

.modal-dialog-content { 
    -fx-padding: 20; 
    -fx-spacing: 10; 
    -fx-alignment: center; 
    -fx-font-size: 20; 
    -fx-background-color: linear-gradient(to bottom, derive(cadetblue, 20%), cadetblue); 
    -fx-border-color: derive(cadetblue, -20%); 
    -fx-border-width: 5; 
    -fx-background-insets: 12; 
    -fx-border-insets: 10; 
    -fx-border-radius: 6; 
    -fx-background-radius: 6; 
} 

eine Bibliothek Verwenden Sie stattdessen

auch zu beachten, dass für Dialoge zu schaffen ich lieber mit dem ControlsFX Projekt sehr empfehlen als die eigene Dialogsystem zu schaffen. Wenn Ihnen in ControlsFX Funktionen fehlen, die Sie benötigen (z. B. die Unterstützung von Schlagschatten), können Sie dafür das Projekt "ControllsFX" verwenden und auf diese Antwort bei Bedarf zurückgreifen.

+1

MAN, ich FC! * @ & # ING LIEBE DICH! Haha!! Ich habe nur die -fx-Hintergrund-Einsätze hinzugefügt! Und es hat das Problem gelöst! O mein Gott .. Nur zu denken, dass es dauerte meine Stunden ... Danke Mann !! Und möge Odin dich segnen! –

+1

@GabrielLopes Ja, ich bekomme die gleiche Reaktion beim Lesen seiner Antworten. – GGrec

0

Nun, ich fand eine sehr einfache Lösung. Vielleicht wurde dies in früheren Versionen nicht unterstützt? jedoch .. Der Code:

iconPane.setEffect(new DropShadow(2d, 0d, +2d, Color.BLACK)); 

Das Bild zeigt das Ergebnis - meine Absicht, ein Symbol in der Optik eines FAB

enter image description here

4

Einfache Arbeits Beispiel zu zeigen war.

First result exampleSecond result example

Hier ist fxml Struktur:

AnchorPane(200,200) // pane for space for shadow 
    \- AnchorPane(center) // appliction pane 
     \- Label // application content 

Echt screen.fxml:

<AnchorPane fx:id="shadowPane" prefHeight="200.0" prefWidth="200.0" xmlns="http://javafx.com/javafx/8.0.40" xmlns:fx="http://javafx.com/fxml/1"> 
    <children> 
     <AnchorPane fx:id="rootPane" layoutX="56.0" layoutY="62.0"> 
     <children> 
      <Label fx:id="someLabel" layoutX="30.0" layoutY="30.0" text="Label" textFill="#f20000" /> 
     </children> 
     <padding> 
      <Insets bottom="20.0" left="20.0" right="20.0" top="20.0" /> 
     </padding> 
     </AnchorPane> 
    </children> 
</AnchorPane> 

Main.java

@Override 
public void start(Stage stage) throws Exception { 
    FXMLLoader loader = new FXMLLoader(getClass().getResource("/sample/screen.fxml")); 
    AnchorPane shadowPane = loader.load(); 
    AnchorPane rootPane = (AnchorPane) shadowPane.lookup("#rootPane"); 
    rootPane.setStyle("-fx-effect: dropshadow(gaussian, rgba(0, 0, 0, 0.4), 10, 0.5, 0.0, 0.0);" + 
         "-fx-background-color: white;"); // Shadow effect 

    Scene scene = new Scene(shadowPane); 
    stage.setScene(scene); 

    shadowPane.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, null, null))); // Some borders for for clarity 

    shadowPane.setStyle("-fx-background-color: transparent;"); // Makes shadowPane transparent 
    scene.setFill(Color.TRANSPARENT); // Fill our scene with nothing 
    stage.initStyle(StageStyle.TRANSPARENT); // Important one! 
    stage.show(); 
} 
+0

Ich würde gerne erwähnen, dass -fx-padding zum rootPane hinzugefügt werden sollte –

Verwandte Themen