升级到最新的 JavaFX 版本 (19) 后,我遇到了一些奇怪的问题。
如果我将最后一个选项设置为 ComboBox 中的值,那么在第一次打开时,如果我选择任何选项,下拉列表将不会隐藏。之后,下拉菜单将像往常一样工作。奇怪的是,只有当我将最后一个选项设置为值时才会发生这种情况。当我设置除最后一个选项之外的任何其他选项时,它运行良好。
在上面的示例中,您可以注意到:
- 如果设置“四”:即使我选择不同的选项(仅第一次),下拉列表也不会隐藏。
- 如果设置为“三”:下拉菜单将照常工作。
当我试图调查根本原因时,我几乎得出结论,这是因为新功能“focusWithIn”。因为这就是导致问题发生的地方。
但经过进一步调查,我还注意到焦点被搞乱了。在上面的 gif 中,您还可以注意到,如果我将最后一个选项设置为值,则“聚焦”样式不会应用于 ComboBox(同样只是第一次,直到我将焦点移到另一个节点,当我回来时,它会照常工作) )。而如果我设置不同的值,则聚焦样式效果会很好。
当我尝试将一些日志放在焦点属性上时,下面是我关注 ComboBox 时的输出(最后一个选项作为值):
ComboBox focused : true
ComboBox focused : false
焦点立即关闭!
唯一让我困惑的是“为什么只有最后一个选项?“。我知道一般都会出现问题/错误。但是与最后一个选项的特殊关系,我无法理解:)
不管怎样,我尝试了不同的方法来使下拉隐藏和焦点起作用,但没有任何效果。你们有什么建议(解决方法)来解决这个问题吗?
下面是工作演示:
import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.CheckBox;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class ComboBoxDemo extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
ComboBox<String> comboBox = new ComboBox<>();
comboBox.getItems().addAll("One", "Two", "Three", "Four");
comboBox.getSelectionModel().select("Four"); // Change value to any other options, it works
comboBox.focusedProperty().addListener((obs, old, focused) -> {
System.out.println("ComboBox focused : " + focused+", showing: "+comboBox.isShowing());
// ATTEMPT #2 : Requesting the focus by conditional checking (DIDN'T WORKED)
if(comboBox.isShowing() && !focused){
comboBox.requestFocus();
}
});
// ATTEMPT #1 : Requesting the focus after the dropdown is shown (DIDN'T WORKED)
comboBox.setOnShown(e -> {
System.out.println("ComboBox shown...");
comboBox.requestFocus();
});
VBox root = new VBox(new CheckBox("Just for focus grabbing"), comboBox);
root.setAlignment(Pos.CENTER);
root.setSpacing(20);
Scene scene = new Scene(root, 300, 200);
primaryStage.setTitle("ComboBox FX " + System.getProperty("javafx.runtime.version"));
primaryStage.setScene(scene);
primaryStage.show();
}
}