我想有一个内部阴影和方框阴影在同一个按钮上使用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 属性的另一种方式.如果您查看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);
    }
}

输出:

snapshot of running example code


为了完整起见,下面是在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>

Css相关问答推荐

如何将bslib::card()中的扩展按钮移到右上方,其中full_screen = TRUE?

Vue3日期 Select 器:作用域样式不起作用

将鼠标悬停在具有效果的元素上

如何使背景出现在具有自己背景 colored颜色 的子元素上

使用CSS Grid是否可以跳过下一列?

flex-wrap 导致 children 身高加倍

使用 React JS 和自定义 CSS 创建 Cookie 横幅

如何在真实文本旁边制作文本阴影,使其看起来像 css 中的重复文本?

没有 colored颜色 Select 器的 JavaFX colored颜色 Select 器

SASS 文件 struct :_typography、_layout 等中的相同 Select 器

基于类的 CSS Select 器

删除在 ios safari / chrome / firefox 中单击的链接上的灰色背景

导航栏中的 Bootstrap 3.0 按钮

rotate3d 速记

了解 Bootstrap 3 中的网格类( col-sm-# 和 col-lg-# )

弹性框中的边距折叠

CSS 悬停与 JavaScript 鼠标悬停

在移动网络上禁用捏zoom

如何在 React 应用程序中使用 CSS 模块应用全局样式?

如何将文本与图标字体垂直对齐?