2014-01-03 6 views

답변

6

StackPane을 사용하고 GridPane을 배치하십시오.

CSS로 StackPane에 스타일을 지정하여 배경색, 인세 트 및 그림자를 적용하십시오.

일부 샘플 CSS는 Drop Shadow in an undecorated Pane! JAVAFX을 참조하십시오.

purple haze

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.layout.StackPane; 
import javafx.stage.Stage; 

public class Shadowed extends Application { 
    public static void main(String[] args) { launch(args); } 

    @Override 
    public void start(Stage stage) throws Exception { 
     Label clear = new Label("Clear, with no shadow"); 
     StackPane shadowedPane = new StackPane(clear); 
     shadowedPane.setStyle(
       "-fx-background-color: palegreen; " + 
       "-fx-background-insets: 10; " + 
       "-fx-background-radius: 10; " + 
       "-fx-effect: dropshadow(three-pass-box, purple, 10, 0, 0, 0);" 
     ); 
     shadowedPane.setPrefSize(200, 50); 
     stage.setScene(new Scene(shadowedPane)); 
     stage.show(); 
    } 
} 

추가 질문

인가를 주소 : 여기

는 효과를 입증하기 위해, (OS X 10.9에 자바 8b120 사용)하는 작은 독립 샘플 응용 프로그램입니다 CSS는 유일한 옵션입니까?

아니요, 이것은 CSS 대신 코드로 DropShadow 효과를 사용하여 수행 할 수 있습니다.

shadowedPane.setEffect(new DropShadow(10, Color.PURPLE)); 

왜 작동합니까?

배경을 설정하면 섀도우 효과가 적용되는 노드에 가장자리가 명확 해지기 때문에.

왜 DropShadow는 루트 노드 또는 중첩 된 컨테이너에 적용되는지에 따라 다르게 작동합니까?

루트 노드 또는 중첩 컨테이너 간의 그림자 처리에는 실제 동작이 다릅니다. 그림자 효과는 효과가 적용된 항목이 투명 (또는 null) 배경인지 여부에 따라 다릅니다. 루트 노드는 일반적으로 스테이지를 채 웁니다. 따라서 루트 노드가 투명하지 않은 배경색을 가지며 인세 트가 제공되지 않으면 루트 노드의 그림자는 스테이지의 보이는 영역 밖으로 떨어지기 때문에 보이지 않습니다.


나는 무슨 일이 일어나고 있는지 추측 할 수 있습니다. 나는 그림자 효과가 노드의 외부 모양을 계산하고 그 위에 그림자를 적용하는 것으로 생각합니다. 노드에 배경색이 있으면 노드 배경의 그림자가 보입니다. 이는 제공된 이미지에서 보이는 것입니다. 노드에 배경색이 없으면 노드의 가장자리가 자식 노드에서 계산되므로 모든 자식이 그림자를 갖습니다.

이제는 질문을 받았을 때 JavaFX 2.2와 JavaFX 8 사이에서 JavaFX의 기본 테마가 Caspian에서 Modena로 옮겨졌습니다. 카스피 니아 창에는 기본적으로 배경색이 없습니다. 그러나 Modena의 경우 창에는 기본적으로 약간 회색 배경색이 있습니다. 즉, GridPane은 내부 텍스트가 음영 처리되는 대신 음영 처리 된 배경을 갖기 때문에 격자 패널 내부의 원래 포스터의 모호한 텍스트는 기본적으로 Java 8에서 발생하지 않습니다.이것은 다음과 같은 프로그램을 실행하고 카스피해에 스타일 시트 설정을위한 주석 라인을 변화를 통해 확인 할 수 있습니다

import javafx.application.Application; 
import javafx.geometry.HPos; 
import javafx.geometry.VPos; 
import javafx.scene.Scene; 
import javafx.scene.control.Label; 
import javafx.scene.effect.DropShadow; 
import javafx.scene.layout.GridPane; 
import javafx.scene.layout.Priority; 
import javafx.scene.paint.Color; 
import javafx.stage.Stage; 

public class Shadowed extends Application { 
    public static void main(String[] args) { launch(args); } 

    @Override 
    public void start(Stage stage) throws Exception { 
//  setUserAgentStylesheet(STYLESHEET_CASPIAN); 
     Label clear = new Label("Clear, with no shadow"); 
     GridPane shadowedPane = new GridPane(); 
     shadowedPane.add(clear, 0, 0); 
     GridPane.setHalignment(clear, HPos.CENTER); 
     GridPane.setValignment(clear, VPos.CENTER); 
     GridPane.setHgrow(clear, Priority.ALWAYS); 
     GridPane.setVgrow(clear, Priority.ALWAYS); 
     shadowedPane.setStyle(
//    "-fx-background-color: transparent; " + 
//    "-fx-background-color: palegreen; " + 
       "-fx-background-insets: 10; " + 
       "-fx-background-radius: 10; " 
     ); 
     shadowedPane.setPrefSize(200, 50); 
     shadowedPane.setEffect(new DropShadow(10, Color.PURPLE)); 
     stage.setScene(new Scene(shadowedPane)); 
     stage.show(); 
    } 
} 
+0

@jewslsea 2childs를 사용하여 stackpane을 작성하는 것과 동일한 기술을 사용하는 제 경우에는 작동하지 않으며 제 2는 내 그리드 패널이지만 어린이 전용으로 적용된 것과 동일합니다. –

+0

간단한 솔루션으로 추가 샘플을 추가했습니다. – jewelsea

+0

CSS는 유일한 옵션입니까? 왜 작동합니까? 'DropShadow'는 루트 노드 또는 중첩 된 컨테이너에 적용되는지에 따라 다르게 작동하는 이유는 무엇입니까? – Itai

3

jewelsea의 대답은 정확하지만 그것이 작동하지 않을 수 있음을 양해 해 주시기 바랍니다을 때

// explicitly transparent 
-fx-background-color: transparent; 

또는

// effectively transparent 
-fx-background-color: #FFFFFF00; 

당신이 (스택) 패널의 전체 경계 상자 영역에 그림자를 적용하려고하지가 치 있다면 이건 정말 실망하실 수 있습니다 내용! 투명하지 않은 배경색을 설정하면 효과가 있지만 여러 요소가 나란히 있거나 서로 가깝게 놓여있는 경우 드롭 그림자와 함께 바람직하지 않은 중첩 효과가 나타날 수 있습니다.

관련 문제

 관련 문제