在JavaFX SceneBuilder中,我想将Pane的边框样式设置为仅在右侧,所以我在JavaFX CSS样式框中放入了以下内容:-FX-BORDER-STYLE:None Solid None,但它使整个边框可见.然后我发现,如果我将"None"作为第一个值,那么边界将始终是完整的.

有没有人能告诉我,怎么解决这个问题,或者有没有其他办法?

JavaFX CSS view

推荐答案

This is a bug in JavaFX 21 CSS border rule processing

这似乎是JavaFX 21中的CSS边界处理中的一个错误.这在SceneBuilder、FXML或JavaFX的核心边界逻辑中都不是问题.

正如詹姆斯在 comments 中指出的那样:

实现(如果顶部边框设置为"None"则不能正常工作)和文档(没有为边框样式的四个不同侧面描述四个值的集合)似乎都有错误.

你可能希望在这件事上file a bug report分.如果这样做,您可以链接回此问题并向此答案添加注释(或编辑),以添加对相关错误报告的引用.

问题是,如果在css规则and中指定所有四种边框样式,则第一个边框样式设置为none,则边框样式不会生效-&>所有边框都会显示.

Replicating the Issue

下面的代码重复了这个问题(在JavaFX 21上测试).

  1. 第一个框呈现不正确,在应该只显示右边框时显示所有四个边框.

    -fx-border-style: none solid none none;
    
  2. 第二个框渲染正确,顶部和右侧边框显示,而其他边框不显示.

    -fx-border-style: solid solid none none;
    
  3. 第三个框渲染正确,只显示正确的边框.然而,这是在代码中实现的,而不是在CSS中实现的.作为一种解决问题的方法,您可以在代码中编写边框样式,而不是使用CSS.

    Border codedBorder = new Border(
            new BorderStroke(
                    Color.BLACK, Color.RED, Color.GREEN, Color.BLUE,
                    BorderStrokeStyle.NONE, BorderStrokeStyle.SOLID, BorderStrokeStyle.NONE, BorderStrokeStyle.NONE,
                    CornerRadii.EMPTY,
                    new BorderWidths(10, 8, 6, 4),
                    Insets.EMPTY
            )
    );
    

demos

Example Code: BrokenBorders.java

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.*;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class BrokenBorders extends Application {
    private static final String CSS = "data:text/css,";
    private static final String CUSTOM_BORDER_CSS = CSS + // language=CSS
            """            
            .broken-border {
                -fx-border-style: none solid none none;
                -fx-border-color: black red green blue;
                -fx-border-width: 10 8 6 4;
                -fx-background-color: lightgreen;
            }

            .working-border {
                -fx-border-style: solid solid none none;
                -fx-border-color: black red green blue;
                -fx-border-width: 10 8 6 4;
                -fx-background-color: lightblue;
            }
            
            .root {
                -fx-font-size: 40px;
            }
            """;

    @Override
    public void start(Stage stage) {
        stage.setScene(new Scene(createLayout()));
        stage.show();
    }

    private static VBox createLayout() {
        StackPane brokenBorderedPane = new StackPane(new Label("1"));
        brokenBorderedPane.getStyleClass().add("broken-border");
        brokenBorderedPane.setPrefSize(100, 100);

        StackPane workingBorderedPane = new StackPane(new Label("2"));
        workingBorderedPane.getStyleClass().add("working-border");
        workingBorderedPane.setPrefSize(100, 100);

        StackPane codedBorderPane = new StackPane(new Label("3"));
        Border codedBorder = new Border(
                new BorderStroke(
                        Color.BLACK, Color.RED, Color.GREEN, Color.BLUE,
                        BorderStrokeStyle.NONE, BorderStrokeStyle.SOLID, BorderStrokeStyle.NONE, BorderStrokeStyle.NONE,
                        CornerRadii.EMPTY,
                        new BorderWidths(10, 8, 6, 4),
                        Insets.EMPTY
                )
        );
        codedBorderPane.setBackground(Background.fill(Color.LIGHTPINK));
        codedBorderPane.setBorder(codedBorder);
        codedBorderPane.setPrefSize(100, 100);

        VBox layout = new VBox(
                10,
                brokenBorderedPane,
                workingBorderedPane,
                codedBorderPane
        );
        layout.getStylesheets().add(CUSTOM_BORDER_CSS);
        layout.setPadding(new Insets(10));

        return layout;
    }

    public static void main(String[] args) {
        launch();
    }
}

Java相关问答推荐

try Dockerize Maven应用程序,但发布版本21不支持"

@org.springframework.beans.factory.annotation.Autowired(required=true)-注入点有以下注释:-SpringBoot

无法处理批处理侦听器中的反序列化异常

关于泛型的覆盖规则

在Java Swing Paint应用程序中捕获快速鼠标移动时遇到困难

使用Spring Boot3.2和虚拟线程的并行服务调用

如何使用值中包含与号的查询参数创建一个java.net.URI

@Rollback @ Transmission在验收测试中不工作

如何在Microronaut中将 map 读取为 map

如何在Cosmos DB(Java SDK)中增加默认响应大小

扩展视图高度,并将其拖动到较低的视图上,而不是将其向下推?

在实例化中指定泛型类型与不指定泛型类型之间的区别

RestTemplate Bean提供OkHttp3ClientHttpRequestFactory不支持Spring Boot 3中的请求正文缓冲

基于Java中mm/dd/yy格式的最近日期对数组列表进行排序

持续时间--为什么在秒为负数的情况下还要做额外的工作?

java.lang.NoSuchMethodError:';org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream$Builder org.apache.poi-poi-ooxml-5.2.4

using case default on switch语句返回;预览特征切换中的模式匹配仅在源级别20及以上的情况下可用;

如何使用Jackson读取以方括号开头的JSON?

为什么当我输入变量而不是直接输入字符串时,我的方法不起作用?

如何使用 JDBC 更改 Postgres Enum 类型