【问题标题】:How to bind a ComboBox's items to a property of another list's items?如何将 ComboBox 的项目绑定到另一个列表项目的属性?
【发布时间】:2018-02-24 02:43:51
【问题描述】:

我有一个简单的User 类,它包含两个属性:

public class User {
    private final StringProperty lastName;
    private final StringProperty firstName;

    public User() {
        lastName = new SimpleStringProperty("");
        firstName = new SimpleStringProperty("");
    }

    public User(
            String lastName,
            String firstName
    ) {
        this.lastName = new SimpleStringProperty(lastName);
        this.firstName = new SimpleStringProperty(firstName);
    }

    public String getFirstName() { return firstName.get(); }

    public String getLastName() { return lastName.get(); }

    public void setFirstName(String firstName) { this.firstName.set(firstName); }

    public void setLastName(String lastName) { this.lastName.set(lastName); }
}

我创建了一个带有 ComboBox 的窗口,其中包含 User 项:

public class WindowController {
    @FXML
    private ComboBox<User> usersComboBox;

    public void setUserList(ObservableList<User> userList) { }
}

我希望setUserListuserList 绑定到usersComboBox,这样userList 中的每个uComboBox 的项目都是u.firstName.get() + " " + u.lastName.get()。每次在 userList 中添加、删除或修改 User 时,ComboBox 必须刷新其项目。

我已经阅读了有关 JavaFX 中的绑定的信息,但我找不到如何做到这一点。推荐的方式是什么?

【问题讨论】:

  • 您不需要绑定任何东西:只需将用户列表(如果“修改”意味着更改用户属性,则使用提取器)设置为组合项目并安装自定义 cellfactory(或配置为转换器)。无论如何,请阅读stackoverflow.com/help/mcve并采取相应措施。
  • 您阅读帮助页面了吗?如果是这样,您为什么不提供描述的 mcve?真的希望 meyou 写它吗?也许,一旦地狱结冰……

标签: java javafx data-binding


【解决方案1】:

我希望我正确地理解了你。

如果是这样,我确实为您提供了一些示例代码:

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

import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ListChangeListener;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;

public class MainApp extends Application
{
    private BorderPane root = new BorderPane();
    private Scene szene = new Scene(root);

    @Override
    public void start(Stage primaryStage) throws Exception
    {
        ComboBox<String> comboBox = new ComboBox<String>();

        List<User> list = new ArrayList<User>();
        ObservableList<User> userList = FXCollections.observableList(list);
        userList.addListener(new ListChangeListener<Object>() {

            @Override
            public void onChanged(Change<?> change)
            {
                comboBox.getItems().clear();
                for(User u : userList)
                {
                    comboBox.getItems().add(u.getName());
                }
            }
        });

        userList.add(new User("Max", "Mustermann"));
        userList.add(new User("Adam", "Sandler"));
        userList.add(new User("Jan", "Boehmermann"));

        root.setCenter(comboBox);

        primaryStage.setScene(szene);
        primaryStage.show();
    }

    public static void main(String[] args)
    {
        launch(args);
    }
}

您可以简单地实例化一个 List 并将其交给 FXCollections.observableList()。然后将 ListChangeListener 添加到 ObservableList 中,它会在更改时更新 ComboBox(显然)。

请记住,您必须在添加每个元素之前清除 ObservableList 以防止加倍。不要向 ArrayList 添加元素,或者请记住,对 ArrayList 的更改不会触发 ObservableList 的 ListChangeListener!

【讨论】:

  • hmm ...你为什么要听 userList 并手动更新组合的项目?只需将 userList(在名字/姓氏上使用提取器)设置为组合的项目,并根据需要安装自定义 cellFactory 以进行显示。什么是列表?你不需要它..
猜你喜欢
  • 2017-12-07
  • 1970-01-01
  • 2021-12-14
  • 2013-01-27
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 2013-07-23
  • 2023-04-01
相关资源
最近更新 更多