From 0540f3c9cd0a7d5a704778ee30cebd25052d4864 Mon Sep 17 00:00:00 2001 From: Glavo Date: Mon, 3 Mar 2025 02:12:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=9C=A8=E4=B8=96=E7=95=8C=E7=AE=A1=E7=90=86?= =?UTF-8?q?=E7=95=8C=E9=9D=A2=E6=98=BE=E7=A4=BA=E4=B8=96=E7=95=8C=E5=9B=BE?= =?UTF-8?q?=E6=A0=87=20(#3689)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 在世界管理界面显示世界图标 * update * update --- .../hmcl/ui/versions/WorldListItem.java | 2 +- .../hmcl/ui/versions/WorldListItemSkin.java | 10 +++++-- .../resources/assets/img/unknown_server.png | Bin 0 -> 6857 bytes .../java/org/jackhuang/hmcl/game/World.java | 28 ++++++++++++++++++ 4 files changed, 37 insertions(+), 3 deletions(-) create mode 100644 HMCL/src/main/resources/assets/img/unknown_server.png diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListItem.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListItem.java index 4a45486ce..b48de3bb2 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListItem.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListItem.java @@ -48,8 +48,8 @@ public class WorldListItem extends Control { this.world = world; title.set(parseColorEscapes(world.getWorldName())); - subtitle.set(i18n("world.description", world.getFileName(), formatDateTime(Instant.ofEpochMilli(world.getLastPlayed())), world.getGameVersion() == null ? i18n("message.unknown") : world.getGameVersion())); + image.set(world.getIcon()); FXUtils.onClicked(this, this::showInfo); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListItemSkin.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListItemSkin.java index 27a8f3dbd..d7b7c51bf 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListItemSkin.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/versions/WorldListItemSkin.java @@ -19,9 +19,11 @@ package org.jackhuang.hmcl.ui.versions; import com.jfoenix.controls.JFXButton; import com.jfoenix.controls.JFXPopup; +import javafx.beans.value.ChangeListener; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.control.SkinBase; +import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.layout.BorderPane; import javafx.scene.layout.HBox; @@ -38,6 +40,9 @@ import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class WorldListItemSkin extends SkinBase { + @SuppressWarnings({"FieldCanBeLocal", "unused"}) + private final ChangeListener iconListener; + public WorldListItemSkin(WorldListItem skinnable) { super(skinnable); @@ -54,14 +59,15 @@ public class WorldListItemSkin extends SkinBase { ImageView imageView = new ImageView(); FXUtils.limitSize(imageView, 32, 32); - imageView.imageProperty().bind(skinnable.imageProperty()); + iconListener = FXUtils.onWeakChangeAndOperate(skinnable.imageProperty(), image -> + imageView.setImage(image == null ? FXUtils.newBuiltinImage("/assets/img/unknown_server.png") : image)); imageViewContainer.getChildren().setAll(imageView); TwoLineListItem item = new TwoLineListItem(); item.titleProperty().bind(skinnable.titleProperty()); item.subtitleProperty().bind(skinnable.subtitleProperty()); BorderPane.setAlignment(item, Pos.CENTER); - center.getChildren().setAll(imageView, item); + center.getChildren().setAll(imageViewContainer, item); root.setCenter(center); PopupMenu menu = new PopupMenu(); diff --git a/HMCL/src/main/resources/assets/img/unknown_server.png b/HMCL/src/main/resources/assets/img/unknown_server.png new file mode 100644 index 0000000000000000000000000000000000000000..0de32741294a8bff1bc23d894a5f730938115f40 GIT binary patch literal 6857 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