您可以在JavaFX CSS中同时使用dropshadow和innershadow吗?

问题描述 投票:0回答:1

我想使用 JavaFX CSS 在同一个按钮上有一个内部阴影和一个盒子阴影。除了我尝试的所有内容仅显示两者之一。

我尝试了这个,但只显示第一个:

-fx-effect:
     innershadow(three-pass-box, rgb(255,255,255),1,0,0,1),
     dropshadow(three-pass-box, rgb(0,0,0),5,0,0,5);

或者这个但只显示最后一个:

-fx-effect: innershadow(three-pass-box, rgb(255,255,255),1,0,0,1),
-fx-effect: dropshadow(three-pass-box, rgb(0,0,0),5,0,0,5);

两者是互相排斥的吗?我在网上没有找到任何答案。

css javafx shadow
1个回答
0
投票

在 JavaFX 中使用 CSS 只是设置节点属性的另一种方法。如果您查看

Node.effect
属性(这是
--fx-effect
的目标属性),您会看到它是一个简单的对象属性。换句话说,一个节点在任何给定时间只能产生一种效果。设置效果将替换旧效果。这就是你第二次尝试时发生的情况。事实上,我很惊讶你的第一次尝试没有导致解析错误;我的猜测是,解析器决定在定义内部阴影的右括号之后解析效果“完成”,然后跳到分号之后。

也就是说,如果您查看

Effect
的实现,您会发现其中许多都有
input
属性(例如,
DropShadow.input
)。该属性允许您“分层”效果。您可以有一个
DropShadow
,其中
InputShadow
作为其
input
,然后将
DropShadow
设置为按钮的效果(反之亦然)。

不幸的是,根据 JavaFX CSS 参考指南,无法通过 CSS 设置效果的

input
。这意味着您必须使用代码(或 FXML)来完成此操作。

例如:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.effect.DropShadow;
import javafx.scene.effect.InnerShadow;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) {
        DropShadow effect = new DropShadow();
        effect.setInput(new InnerShadow());

        Button button = new Button("Test");
        button.setEffect(effect);

        StackPane root = new StackPane(button);
        primaryStage.setScene(new Scene(root, 250, 175));
        primaryStage.show();
    }

    public static void launch(String[] args) {
        launch(Main.class);
    }
}

输出:

© www.soinside.com 2019 - 2024. All rights reserved.