效果链 - CSS等效于javafx中的effect.setInput

时间:2014-12-04 12:15:50

标签: css javafx javafx-8

我需要通过CSS应用多种效果(主要是innershadow和dropshadow)。但是我无法链接这些效果。
是否有javafx.scene.effect.Effect的setInput()的CSS等价物? 到目前为止,我发现只有this链接。它表示有关修复的内容,但没有关于如何使用链接的详细信息 编辑:如果问题不明确,请进一步解释:
要通过css应用效果,请使用-fx-effect。我需要将多个效果应用于同一节点。如何"链" CSS中的这些效果?这可以通过使用前面提到的setInput()的代码轻松完成。 TIA

2 个答案:

答案 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选项:

Applying chain effect 1

然后选择InnerShadow,定义效果,再次选择Replace Effect Input,再次选择InnerShadow

Applying chain effect 2

定义效果,保存并退出。这将是源代码:

<?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();
}

这将是结果:

Chain of Effects