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

JAVAFX 8组合框和可观察列表

裴昊阳
2023-03-14

我需要一个通过observatelist填充的组合框,其中包含从DB检索的特定数据。这是我的消息来源。

模型

public ObservableList<Bank> listBank = FXCollections.observableArrayList();

public static class Bank {
            private final StringProperty id;
            private final StringProperty name;

            private Bank(
                    String id, 
                    String name
            ) {
            this.id = new SimpleStringProperty(id);
            this.name = new SimpleStringProperty(name);        
            }

            public StringProperty idProperty() { return id; }
            public StringProperty nameProperty() { return name; }        
        }

查看

@FXML
private ComboBox comboBank<Bank>;

public final void getBankDataFields() {
        comboBank.setItems(model.listBank); 
    }

comboBank.setButtonCell(new ListCell<Bank>() {
                @Override
                protected void updateItem(Bank t, boolean bln) {
                    super.updateItem(t, bln);
                    if (t != null) {
                        setText(t.nameProperty().getValue().toUpperCase());
                    } else {
                        setText(null);
                    }
                }
            });

comboBank.setCellFactory(new Callback<ListView<Bank>, ListCell<Bank>>() {
                @Override 
                public ListCell<Bank> call(ListView<Bank> p) {
                    return new ListCell<Bank>() { 
                        @Override
                        protected void updateItem(Bank t, boolean bln) {
                            super.updateItem(t, bln);
                            if(t != null){
                                setText(t.nomeProperty().getValue().toUpperCase());
                            } else {
                                setText(null);
                            }    

                        }                       
                    };
                }
            });

comboBank.valueProperty().addListener((ObservableValue<? extends Bank> observable, Bank oldValue, Bank newValue) -> {
                setIdBank(newValue.idProperty().getValue());
            });

ComboBox由NAME字段填充,listener用于获取相对ID并将其传递给查询,以便在DB上存储数据。

好的,一切似乎都正常,但我有两个问题:

>

  • 当用户需要修改此记录时,我需要从DB获取ID并在ComboBox中选择相对名称。我该怎么做?

    comboBank.set值;

    有没有更好的方法来实现这一目标?可观察地图可以替代可观察列表吗?

    提前感谢。

  • 共有1个答案

    杨良才
    2023-03-14

    有一种更简单的方法可以实现你想要实现的目标。您应该在组合框上使用<code>StringConverter</code>来显示Bank实例的名称。

    comboBox.setConverter(new StringConverter<Bank>() {
    
        @Override
        public String toString(Bank object) {
           return object.nameProperty().get();
        }
    
        @Override
        public Bank fromString(String string) {
           // Somehow pass id and return bank instance
           // If not important, just return null
           return null;
        }
    });
    

    要获取所选值,即所选银行的实例,只需使用:

    comboBox.getValue();
    

    MCVE

    import javafx.animation.PauseTransition;
    import javafx.application.Application;
    import javafx.collections.FXCollections;
    import javafx.collections.ObservableList;
    import javafx.geometry.Pos;
    import javafx.scene.Scene;
    import javafx.scene.control.ComboBox;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
    import javafx.util.Duration;
    import javafx.util.StringConverter;
    
    import java.util.stream.Collectors;
    
    public class Main extends Application {
    
        @Override
        public void start(Stage stage) {
    
            ComboBox<Bank> comboBox = new ComboBox<>();
            ObservableList<Bank> items = FXCollections.observableArrayList(
                    new Bank("1", "A"), new Bank("2", "B"),
                    new Bank("3", "C"), new Bank("4", "D"));
            comboBox.setItems(items);
            StringConverter<Bank> converter = new StringConverter<Bank>() {
                @Override
                public String toString(Bank bank) {
                    return bank.nameProperty().get();
                }
    
                @Override
                public Bank fromString(String id) {
                    return items.stream()
                            .filter(item -> item.idProperty().get().equals(id))
                            .collect(Collectors.toList()).get(0);
                }
            };
            comboBox.setConverter(converter);
            // Print the name of the Bank that is selected
            comboBox.getSelectionModel().selectedItemProperty().addListener((o, ol, nw) -> {
                System.out.println(comboBox.getValue().nameProperty().get());
            });
            // Wait for 3 seconds and select the item with id = 2
            PauseTransition pauseTransition = new PauseTransition(Duration.seconds(3));
            pauseTransition.setOnFinished(event -> comboBox.getSelectionModel().select(converter.fromString("2")));
            pauseTransition.play();
            VBox root = new VBox(comboBox);
            root.setAlignment(Pos.CENTER);
            Scene scene = new Scene(root, 200, 200);
            stage.setScene(scene);
            stage.show();
        }
    }
    
     类似资料:
    • 我想做的是让一个类保持国家的静态可观察列表。我想在组合框中显示这些国家。我这部分工作得很好。现在,我还想让用户能够向列表中添加新的国家。因此,组合框旁边有一个按钮,它将显示另一个允许输入另一个国家名称的对话框。在用户输入国家名称并单击save之后,我希望单个静态ObservableList用新的国家更新,然后显示在组合框中。这部分没有发生。 我将展示什么有效,什么无效。 保存对静态列表的引用并更新

    • 问题内容: 我正在尝试将项目设置为表视图,但是setitems方法需要一个可观察的列表,而我的模型中却有一个可观察的集合.FXCollections实用程序类没有给定可观察的集合来创建可观察的列表的方法。类强制转换异常(按预期)。 目前,我正在使用这种代码 而且我有一些问题: 在表中进行编辑是否会按预期更新基础集? 这是这样做的“正确”方法吗 简而言之,我需要样式指南或最佳做法,以便在可观察集和可

    • 问题内容: 我一直在阅读Observer模式,以保持UI处于最新状态,但仍然看不到它的用途。即使在我的特定对象中通知了我的MainActivity然后运行update();方法我仍然无法使用Pet对象来获取更新值,因为该对象是在Oncreate中创建的…而我只是无法创建新对象,因为那时变量会有所不同..这是我的实施,它似乎不起作用。 观察者/ MainActivity 可观察/宠物 问题答案: 首

    • 问题内容: 我正在尝试在JavaFX 8中创建一个,需要一个。我不知道如何创建一个……但是,如果我尝试: 我收到一个错误消息,说它无法实例化,因为它是抽象的。可以理解的 如果我查看该文档,可以看到,但是我做不到: 因为没有适用的构造函数。显然我需要传递给,这很奇怪,因为我无法创建。 我不确定如何解密。如果我尝试 出于绝望,我得到了一个更加复杂的错误。 也不起作用。它以某种方式起作用(但显然使用了不

    • 问题内容: 给定汽车清单(),我可以这样做: 有没有办法我可以从一个到一个序列? 像没有参数的东西 问题答案: 您可以这样映射到: 请注意,flatMapping可能不会保留源可观察的顺序。如果订单对您很重要,请使用。

    • 我试图理解当我使用 在或之后,在我使用时返回true 我知道是一次性的。isDisposed()返回false。有人能解释一下到底发生了什么吗?。我理解一个写得很好的观察。create不能在onComplete()或onError()之后发出项。