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上测试).
第一个框呈现不正确,在应该只显示右边框时显示所有四个边框.
-fx-border-style: none solid none none;
第二个框渲染正确,顶部和右侧边框显示,而其他边框不显示.
-fx-border-style: solid solid none none;
第三个框渲染正确,只显示正确的边框.然而,这是在代码中实现的,而不是在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
)
);
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();
}
}