当前位置: 首页 > 知识库问答 >
问题:

javafx组合框项目列表问题

卫和洽
2023-03-14

我试图使用JavaFX组合框作为带有历史记录的搜索字段。这是我的代码示例。

ObservableList<String> patternHistory = FXCollections.observableArrayList();
searchComboBox.setItems(patternHistory);

searchComboBox.valueProperty().addListener((observable, oldValue, newValue) -> {

    ObservableList<String> history = searchComboBox.getItems();

    // This works fine
    // history.add(newValue);

    // This does not work
    history.add(0, newValue);
});

如果我做历史记录。add(newValue)组合框的行为符合我的预期。历史记录中的最后一个条目将添加到列表的末尾。但是,我希望首先显示最后一个条目(我也希望删除重复项并限制历史大小,但在本例中我保持简单)。

所以我决定简单地将新值添加到列表前面的history中。添加(0,newValue)。然而,当我这样做时,组合框开始以奇怪的方式运行,代码不再工作。看起来,只要我在列表的末尾添加/删除项目,它就可以正常工作,但是如果我在开始或中间做同样的事情,它就不起作用了。

这里我使用的是lambda表达式语法,但我尝试了匿名类表示法,结果是一样的。我还尝试实现我自己的可观察列表,结果也是一样的。

我目前正在使用JDK1.8。0_60但是我在早期版本中遇到了问题。有人能告诉我是否有办法解决这个问题或者我是否做错了什么吗?

共有1个答案

蓬祺
2023-03-14

解决方法似乎是替换列表中的所有项。以下方法似乎工作正常:

import java.util.ArrayList;
import java.util.List;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class HistoryListComboBox extends Application {

    @Override
    public void start(Stage primaryStage) {
        ComboBox<String> combo = new ComboBox<>();
        combo.getItems().addAll("One", "Two", "Three");
        combo.setEditable(true);
        combo.valueProperty().addListener((obs, oldValue, newValue) -> {
            if (! combo.getItems().contains(newValue)) {
                List<String> newItems = new ArrayList<>();
                newItems.add(newValue);
                newItems.addAll(combo.getItems());
                combo.getItems().setAll(newItems);
            }
        });
        StackPane root = new StackPane(combo);
        primaryStage.setScene(new Scene(root, 350, 120));
        primaryStage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
 类似资料:
  • 我试图更改JavaFX组合框列表的文本颜色,但它似乎不起作用。 返回以下内容:下拉列表文本不是白色 我该怎么解决这个问题?我的CSS知识不是很强。

  • 我正在用文本对象填充一个组合框。通过使用文本对象而不是字符串,我可以添加一个id值,我可以在程序中使用它,然后在我决定国际化UI时利用它。不管怎样,以下是我正在做的:主课: } 控制器: 测验fxml: 现在,这个很好用。但问题是,当我选择一个项目时,该项目上的文本会变成空白,如下所示: 如果我选择另一个,它也会消失: 我仍然可以选择这些项目,但它们只是不在那里。这是一个错误吗?如果是的话,有办法

  • 我正在开发一些学术性的JavaFX桌面应用程序。在创建注册表单时,我需要使用combobox/choicebox,但在这一步中我遇到了几个问题。组合框没有显示任何项目。我尝试了许多在堆栈溢出上找到的修复方法,但似乎都不起作用。我在分享我的主要观点。java控制器代码和我的FXML代码放在一边。 Main.java Controller.java FXML文件

  • 我在工作表上使用“生成”按钮。当我单击按钮时,会出现一个弹出窗口(表单),其中包含两个组合框。根据第一个组合框中的选择,填充第二个组合框选项列表。 对于第一个组合框,当我对项目值进行硬编码时,它工作正常。表单代码如下: 我尝试使用以下表单代码从Excel工作表中的列中获取组合框项目值,从而使此项目列表动态化: 但是上面的代码抛出错误:运行时错误“1004”:对象“_Global”的方法“范围”失败

  • 我需要一个通过observatelist填充的组合框,其中包含从DB检索的特定数据。这是我的消息来源。 模型 查看 ComboBox由NAME字段填充,listener用于获取相对ID并将其传递给查询,以便在DB上存储数据。 好的,一切似乎都正常,但我有两个问题: > 当用户需要修改此记录时,我需要从DB获取ID并在ComboBox中选择相对名称。我该怎么做? comboBank.set值; 有没

  • 问题内容: 我有一个带有组合框的UI。每次组合将要打开列表时,必须刷新可以选择的项目列表。 有什么办法-即添加一个侦听器,该侦听器将通知UI Combo即将打开? 不幸的是,当列表更改时,我无法观察模型来更新列表。 问题答案: 不幸的是,SWT组件没有这种方法。在Swing中,借助于PopupMenuListener接口将很容易。 我可以想到的一种解决方法是实现MouseListener和Keyb