我需要通过CSS应用多种效果(主要是innershadow和dropshadow)。但是我无法链接这些效果。
是否有javafx.scene.effect.Effect的setInput()的CSS等价物?
到目前为止,我发现只有this链接。它表示有关修复的内容,但没有关于如何使用链接的详细信息
编辑:如果问题不明确,请进一步解释:
要通过css应用效果,请使用-fx-effect
。我需要将多个效果应用于同一节点。如何"链" CSS中的这些效果?这可以通过使用前面提到的setInput()的代码轻松完成。
TIA
答案 0 :(得分:1)
目前,在Java 7和Java 8中,链接效果或通过CSS应用多种效果是不可能的。请参阅Oracle CSS Documentation。
CSS vs Code文章中也提到了这一点。
答案 1 :(得分:1)
正如@Lorand所提到的,它不可能通过CSS链接效果。
他还提供了一个众所周知的链接效果示例链接。
我将提供FXML解决方案,使用相同的示例来比较结果。
通过(更新)代码:
@Override
public void start(Stage primaryStage) throws IOException {
Circle circle = new Circle(64,64,48);
Paint fill = new LinearGradient(0, 0, 0, 1,
true, CycleMethod.NO_CYCLE,
new Stop(0.0, Color.rgb(207, 0, 58)),
new Stop(1.0, Color.rgb(129, 0, 33)));
circle.setFill(fill);
circle.setStroke(null);
InnerShadow innerShadow = new InnerShadow(BlurType.GAUSSIAN,Color.color(0, 0, 0, 0.65),5,0,0,-5);
InnerShadow innerGlow = new InnerShadow(BlurType.GAUSSIAN,Color.color(1, 1, 1, 0.65),5,0,0,5);
innerGlow.setInput(innerShadow);
DropShadow dropShadow = new DropShadow(BlurType.GAUSSIAN, Color.color(0, 0, 0, 0.65), 5, 0, 0, 0);
dropShadow.setInput(innerGlow);
circle.setEffect(dropShadow);
VBox vBox = new VBox(circle);
vBox.setAlignment(Pos.CENTER);
Scene scene = new Scene(vBox,200,200,Color.web("#a9a9a9"));
primaryStage.setTitle("Chain effect by code");
primaryStage.setScene(scene);
primaryStage.show();
}
请注意,效果的定义方式与应用程序的顺序相反。为了清楚起见,我们也可以这样写:
circle.setEffect(dropShadow);
dropShadow
.setInput(innerGlow);
innerGlow
.setInput(innerShadow);
现在让我们使用Scene Builder 2.0创建一个FXML文件circle.fxml
。
获得圆圈后,我们设置DropShadow
效果,然后编辑效果,并从菜单按钮中选择Replace Effect Input
选项:
然后选择InnerShadow
,定义效果,再次选择Replace Effect Input
,再次选择InnerShadow
:
定义效果,保存并退出。这将是源代码:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.effect.*?>
<?import javafx.scene.paint.*?>
<?import java.lang.*?>
<?import javafx.scene.shape.*?>
<VBox alignment="CENTER" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<children>
<Circle radius="48.0" stroke="TRANSPARENT" strokeType="INSIDE" strokeWidth="1.0">
<fill>
<LinearGradient endX="0.0" endY="1" proportional="true" startX="0" startY="0">
<stops>
<Stop color="#cf003a" offset="0.0" />
<Stop color="#810021" offset="1.0" />
</stops>
</LinearGradient>
</fill>
<effect>
<DropShadow blurType="GAUSSIAN" color="#000000a6" radius="5.0">
<input>
<InnerShadow blurType="GAUSSIAN" color="#ffffffa6" offsetY="5.0" radius="5.0">
<input>
<InnerShadow blurType="GAUSSIAN" color="#000000a6" offsetY="-5.0" radius="5.0" />
</input>
</InnerShadow>
</input>
</DropShadow>
</effect>
</Circle>
</children>
</VBox>
最后,在我们的场景中加载此文件:
@Override
public void start(Stage primaryStage) throws IOException {
VBox vBox = FXMLLoader.load(getClass().getResource("circle.fxml"));
Scene scene = new Scene(vBox,200,200,Color.web("#a9a9a9"));
primaryStage.setTitle("Chain effect by FXML");
primaryStage.setScene(scene);
primaryStage.show();
}
这将是结果: