From f1945a7ff9c04fd56bb3c86f17bd908613561ad3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=9E=E5=BA=90?= <109708109+Ciilu@users.noreply.github.com> Date: Tue, 24 Feb 2026 09:20:23 +0800 Subject: [PATCH 1/3] update --- .../hmcl/ui/construct/LineSelectButton.java | 34 ++++++++++++++++--- 1 file changed, 29 insertions(+), 5 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LineSelectButton.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LineSelectButton.java index 4bbf5f1d5b..e0c6acc702 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LineSelectButton.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LineSelectButton.java @@ -20,16 +20,18 @@ import com.jfoenix.controls.JFXPopup; import javafx.beans.InvalidationListener; import javafx.beans.binding.Bindings; -import javafx.beans.property.*; +import javafx.beans.property.ListProperty; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleListProperty; +import javafx.beans.property.SimpleObjectProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.css.PseudoClass; import javafx.geometry.Pos; import javafx.scene.control.Label; -import javafx.scene.input.MouseButton; -import javafx.scene.input.MouseEvent; -import javafx.scene.input.ScrollEvent; -import javafx.scene.layout.*; +import javafx.scene.input.*; +import javafx.scene.layout.StackPane; +import javafx.scene.layout.VBox; import org.jackhuang.hmcl.ui.FXUtils; import org.jackhuang.hmcl.ui.SVG; import org.jackhuang.hmcl.util.javafx.MappedObservableList; @@ -51,6 +53,8 @@ public final class LineSelectButton extends LineButton { public LineSelectButton() { this.getStyleClass().add(DEFAULT_STYLE_CLASS); + this.addEventHandler(KeyEvent.KEY_PRESSED, this::handleKeyEvent); + InvalidationListener updateTrailingText = observable -> { T value = getValue(); if (value != null) { @@ -81,6 +85,8 @@ public void fire() { PopupMenu popupMenu = new PopupMenu(); this.popup = new JFXPopup(popupMenu); + popupMenu.addEventHandler(KeyEvent.KEY_PRESSED, this::handleKeyEvent); + ripplerContainer.addEventFilter(ScrollEvent.ANY, ignored -> popup.hide()); Bindings.bindContent(popupMenu.getContent(), MappedObservableList.create(itemsProperty(), item -> { @@ -213,4 +219,22 @@ public ObservableList getItems() { return items.get(); } + private void handleKeyEvent(KeyEvent event) { + ObservableList list = getItems(); + if (list == null || list.isEmpty()) return; + int index = list.indexOf(getValue()); + + var code = event.getCode(); + + if (code == KeyCode.UP && index > 0) { + setValue(list.get(index - 1)); + } else if (code == KeyCode.DOWN && index < list.size() - 1) { + setValue(list.get(index + 1)); + } else if (code == KeyCode.ENTER || code == KeyCode.ESCAPE) { + if (popup != null && popup.isShowing()) { + popup.hide(); + event.consume(); + } + } + } } From b07753f3f6ae4e1a1dbd8a3a018db4013230e5b4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=9E=E5=BA=90?= <109708109+CiiLu@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:16:22 +0800 Subject: [PATCH 2/3] Update LineSelectButton.java --- .../java/org/jackhuang/hmcl/ui/construct/LineSelectButton.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LineSelectButton.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LineSelectButton.java index e0c6acc702..0f7b6c461f 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LineSelectButton.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LineSelectButton.java @@ -228,8 +228,10 @@ private void handleKeyEvent(KeyEvent event) { if (code == KeyCode.UP && index > 0) { setValue(list.get(index - 1)); + event.consume(); } else if (code == KeyCode.DOWN && index < list.size() - 1) { setValue(list.get(index + 1)); + event.consume(); } else if (code == KeyCode.ENTER || code == KeyCode.ESCAPE) { if (popup != null && popup.isShowing()) { popup.hide(); From 0414f83d1bd9bcc9821a25f23ee84a6256317b57 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=BE=9E=E5=BA=90?= <109708109+Ciilu@users.noreply.github.com> Date: Tue, 24 Feb 2026 20:57:27 +0800 Subject: [PATCH 3/3] update --- .../hmcl/ui/construct/LineSelectButton.java | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LineSelectButton.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LineSelectButton.java index 0f7b6c461f..d56b21a058 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LineSelectButton.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/LineSelectButton.java @@ -226,11 +226,19 @@ private void handleKeyEvent(KeyEvent event) { var code = event.getCode(); - if (code == KeyCode.UP && index > 0) { - setValue(list.get(index - 1)); + if (code == KeyCode.UP) { + if (index > 0) { + setValue(list.get(index - 1)); + } else { + setValue(list.get(list.size() - 1)); + } event.consume(); - } else if (code == KeyCode.DOWN && index < list.size() - 1) { - setValue(list.get(index + 1)); + } else if (code == KeyCode.DOWN) { + if (index < list.size() - 1) { + setValue(list.get(index + 1)); + } else { + setValue(list.get(0)); + } event.consume(); } else if (code == KeyCode.ENTER || code == KeyCode.ESCAPE) { if (popup != null && popup.isShowing()) {