使用 StackPane 并将 GridPane 放入其中。
使用 CSS 设置 StackPane 的样式以应用背景颜色、插图和阴影。
See 在未装饰的窗格中放置阴影! JAVAFX一些 CSS 示例。
这是一个小型独立示例应用程序(在 OS X 10.9 上使用 Java 8b120),以演示效果:
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 是唯一的选择吗?
不,这可以通过使用代码而不是 CSS 来完成阴影 effect.
shadowedPane.setEffect(new DropShadow(10, Color.PURPLE));
为什么它有效?
因为设置背景可以为应用阴影效果的节点提供清晰的边缘。
为什么 DropShadow 根据是否应用于根节点或嵌套容器而工作方式有所不同?
根节点或嵌套容器之间的投影处理没有真正不同的行为。投影效果取决于应用了该效果的项目是否具有透明(或空)背景。但请注意,根节点通常会填充一个阶段。因此,如果根节点具有不透明的背景颜色并且未提供插图,则根节点上的阴影将不会被看到,因为它将落在舞台的可见区域之外。
我将猜测正在发生的事情。我认为阴影效果的作用是计算节点的外部形状,然后将阴影应用于它。当该节点具有背景颜色时,您将看到节点背景的阴影,这就是在提供的图像中看到的。如果节点没有背景颜色,则节点的边缘是根据子节点计算的,因此所有子节点都会获得阴影。
现在发生的事情是,在提出问题时的 JavaFX 2.2 和 JavaFX 8 之间,JavaFX 的默认主题从 Caspian 移至 Modena。默认情况下,里海窗格没有任何背景颜色。然而,对于摩德纳,默认情况下窗格确实具有轻微的灰白色背景颜色。这意味着在 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();
}
}