From 2ce4fcabcb1306d6c4173408ec9639c86c79f433 Mon Sep 17 00:00:00 2001 From: Glavo Date: Sun, 2 Nov 2025 20:52:12 +0800 Subject: [PATCH] =?UTF-8?q?Revert=20#4453:=20=E6=81=A2=E5=A4=8D=E5=AF=B9?= =?UTF-8?q?=20JavaFX=2014=20=E7=9A=84=E5=85=BC=E5=AE=B9=E6=80=A7=20(#4749)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jackhuang/hmcl/setting/StyleSheets.java | 29 ++++++++++++++++--- 1 file changed, 25 insertions(+), 4 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/setting/StyleSheets.java b/HMCL/src/main/java/org/jackhuang/hmcl/setting/StyleSheets.java index d61dcd052..e4041a5ab 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/setting/StyleSheets.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/setting/StyleSheets.java @@ -22,13 +22,19 @@ import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.scene.Scene; import javafx.scene.paint.Color; +import org.jackhuang.hmcl.ui.FXUtils; +import java.io.IOException; +import java.nio.charset.Charset; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.Arrays; import java.util.Base64; import java.util.Locale; import static org.jackhuang.hmcl.setting.ConfigHolder.config; +import static org.jackhuang.hmcl.util.logging.Logger.LOG; /** * @author Glavo @@ -51,8 +57,23 @@ public final class StyleSheets { config().themeProperty().addListener(o -> stylesheets.set(THEME_STYLE_SHEET_INDEX, getThemeStyleSheet())); } - private static String toStyleSheetUri(String styleSheet) { - return "data:text/css;charset=UTF-8;base64," + Base64.getEncoder().encodeToString(styleSheet.getBytes(StandardCharsets.UTF_8)); + private static String toStyleSheetUri(String styleSheet, String fallback) { + if (FXUtils.JAVAFX_MAJOR_VERSION >= 17) + // JavaFX 17+ support loading stylesheets from data URIs + // https://bugs.openjdk.org/browse/JDK-8267554 + return "data:text/css;charset=UTF-8;base64," + Base64.getEncoder().encodeToString(styleSheet.getBytes(StandardCharsets.UTF_8)); + else + try { + Path temp = Files.createTempFile("hmcl", ".css"); + // For JavaFX 17 or earlier, CssParser uses the default charset + // https://bugs.openjdk.org/browse/JDK-8279328 + Files.writeString(temp, styleSheet, Charset.defaultCharset()); + temp.toFile().deleteOnExit(); + return temp.toUri().toString(); + } catch (IOException | NullPointerException e) { + LOG.error("Unable to create stylesheet, fallback to " + fallback, e); + return fallback; + } } private static String getFontStyleSheet() { @@ -102,7 +123,7 @@ public final class StyleSheets { builder.append('}'); - return toStyleSheetUri(builder.toString()); + return toStyleSheetUri(builder.toString(), defaultCss); } private static String rgba(Color color, double opacity) { @@ -129,7 +150,7 @@ public final class StyleSheets { "-fx-base-disabled-text-fill:" + rgba(theme.getForegroundColor(), 0.7) + ";" + "-fx-base-text-fill:" + Theme.getColorDisplayName(theme.getForegroundColor()) + ";" + "-theme-thumb:" + rgba(theme.getPaint(), 0.7) + ";" + - '}'); + '}', blueCss); } public static void init(Scene scene) {