2013-07-10 9 views
5

whats up?Upuść cień w bezbarwnym okienku! JAVAFX

Cóż, staram się, aby mój panel wyglądał trochę lepiej, wizualnie, więc to, co robię: ustaw mój etap NIEWYKORZYSTE (OK) i (SPRÓBUJ), aby dodać efekt cieniowania (NIE OK) .

I Wyszukiwał (DUŻO) pytania w ten sposób przez Internet, znaleziono kilka podobnych przypadków (creating undecorated stage in javafx 2.0 i How to add shadow to window in JavaFX?), ale nie działa dla mnie.

Wydaje się, że cień jest TAK NIE, nie jest ustawiony! Nie mogę zrozumieć, dlaczego.

Zobacz, co mam:

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; 
} 

Dziękuję chłopaki! Nie mogę się doczekać odpowiedzi! (Podczas gdy będę próbować, co mogę).

PS :. Srry po angielski nie jest moim głównym językiem. Mam nadzieję, że zrozumiesz.

+1

Pokaż nam initDropShadow(). –

Odpowiedz

11

poprzednim przykładzie działa na mnie

The example code dostarczonej przez odpowiedź na How to add shadow to window in JavaFX? działa dobrze dla mnie (cień w oknie widoczny) na Jawie 8b96, Windows 7. Kiedy napisałem go dla JavaFX 2, działało również w tym środowisku.

Nie mogłem powiedzieć dokładnie, czego brakuje w twoim przykładzie, ponieważ nie podano pełnego kodu wykonywalnego.

transparent-dialog

Możliwy problem z kodem

Domyślam się, że nie są insetting zawartość tła tak, że nie ma miejsca w oknie dialogowym dla cieniu być pokazane. Oznacza to, że wypełniasz okno dialogowe treścią i nie opuszczasz miejsca w oknie dialogowym wokół treści, aby efekt mógł zostać wyświetlony. Poniższy przykład osiąga insetting z reguły css -fx-background-insets: 12;

Updated Przykładowy kod

skopiowane zmodyfikowaną wersję kodu przykład do tej odpowiedzi, tak aby nie tylko zawarte w niejasnych linku GIST off kolejna odpowiedź. Modyfikacje mają polegać tylko na użyciu standardowych wywołań API, ponieważ budownicze użyte w oryginalnej odpowiedzi zostały wycofane, ponieważ pierwotna odpowiedź została utworzona.

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; 
} 

użyć biblioteki Zamiast

Należy również pamiętać, że do tworzenia okien dialogowych Gorąco polecam korzystania projekt ControlsFX zamiast tworzenia własnego systemu dialogowego. Jeśli ControlsFX nie ma wymaganych funkcji (takich jak obsługa cienia), możeszza to przeciw projektowi ControlsFX i w razie potrzeby powrócić do tej odpowiedzi.

+1

MAN, I FC! * @ & # ING LOVE YOU! ha ha!! Właśnie dodałem wstawki -fx-background-in! I rozwiązał problem! O mój Boże .. Po prostu myśl, że zajęło mi to godziny ... Dzięki! I niech Odyn was błogosławi! –

+1

@GabrielLopes Tak, mam taką samą reakcję, gdy czytam jego odpowiedzi. – GGrec

0

Cóż, znalazłem bardzo proste rozwiązanie . Może to nie było obsługiwane we wcześniejszych wersjach? jednak .. Kod:

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

Obraz pokazuje wynik - moim zamiarem było pokazanie ikonę w wyglądzie z FAB

enter image description here

4

Proste pracy przykład.

First result exampleSecond result example

Oto fxml struktura:

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

rzeczywistym 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

Byłbym dobrze wspomnieć, że -fx-padding powinien zostać dodany do rootPane –