仅将dropShadow添加到网格窗格JavaFx 2.2的边框

时间:2014-01-03 07:44:57

标签: css javafx-2

只想将投影添加到网格窗格的边框而不是内部子元素

enter image description here 这是显示效果的屏幕图像。

2 个答案:

答案 0 :(得分:7)

使用StackPane并将GridPane放入其中。

使用CSS为StackPane设置样式以应用背景颜色,插图和投影。

有关示例CSS,请参阅Drop Shadow in an undecorated Pane! JAVAFX

这是一个小型独立示例应用程序(在OS X 10.9上使用Java 8b120),以演示效果:

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

解决其他问题

  

CSS是唯一的选择吗?

不,这可以通过使用DropShadow效果在代码而不是CSS中完成。

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

为什么会这样?

因为设置背景为应用阴影效果的节点提供了清晰的边缘。

  

为什么DropShadow的工作方式不同,具体取决于它是应用于根节点还是嵌套容器?

根节点或嵌套容器之间的投影处理没有真正不同的行为。投影效果取决于具有应用效果的项目是否具有透明(或空)背景。请注意,根节点通常填充一个阶段。因此,如果根节点具有不透明的背景颜色并且没有提供插入,则根节点上的阴影将不会被看到,因为它将落在舞台的可见区域之外。


我会猜测发生了什么。我认为投影效果正在做的是计算节点的外部形状,然后将阴影应用于它。当该节点具有背景颜色时,您将看到节点背景的阴影,这是在提供的图像中看到的阴影。如果节点没有背景颜色,则从子节点计算节点的边缘,因此所有子节点都会生成阴影。

现在发生的事情是,在提出问题的JavaFX 2.2和JavaFX 8之间,JavaFX的默认主题从Caspian转移到了Modena。 Caspian窗格默认没有任何背景颜色。然而,对于摩德纳来说,窗格默认具有轻微的灰白色背景色。这意味着在Java 8中默认情况下不会出现原始海报在网格窗格内的模糊文本,因为GridPane将具有被遮蔽的背景,而不是内部文本被遮蔽。这可以通过运行以下程序并更改注释掉的行来验证,以便将样式表设置为Caspian:

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

答案 1 :(得分:3)

jewelsea的回答是正确的,但请注意,

时它不起作用
// explicitly transparent
-fx-background-color: transparent;

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

如果您尝试将投影应用于(堆栈)窗格的整个边界框区域而不是它的子内容,这可能会非常令人沮丧!设置不透明的背景颜色是有效的,但如果你有许多元素并排或彼此叠加(即靠近在一起),你可能会看到阴影的不良重叠效果。