我想使用 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);
两者是互相排斥的吗?我在网上没有找到任何答案。
在 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);
}
}
输出: