在JavaFX中使用CSS只是设置 node 属性的另一种方式.如果您查看Node.effect
属性,它是--fx-effect
的目标属性,您将看到它是一个简单的对象属性.换句话说,一个 node 在任何给定时间只能有一个效果.设置效果将取代旧的效果.这就是你第二次try 时发生的事情.实际上,我很惊讶您的第一次try 没有导致解析错误;我的猜测是,解析器在定义内部阴影的结束括号之后决定"完成"对效果的解析,然后跳到分号后面.
也就是说,如果你看一下Effect
的实现,它们中的许多都有input
属性(例如,DropShadow.input
).该属性使您可以"层次化"效果.您可以将DropShadow
设置为InnerShadow
作为其input
,然后将DropShadow
设置为按钮的效果(反之亦然).
不幸的是,根据JavaFX CSS Reference Guide,没有办法通过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 main(String[] args) {
launch(Main.class);
}
}
输出:
为了完整起见,下面是在FXML中定义的相同场景图:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.effect.DropShadow?>
<?import javafx.scene.effect.InnerShadow?>
<?import javafx.scene.layout.StackPane?>
<StackPane xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml">
<Button text="Test">
<effect>
<DropShadow>
<input>
<InnerShadow />
</input>
</DropShadow>
</effect>
</Button>
</StackPane>