gpt4 book ai didi

java - 组合框不更新所选项目

转载 作者:行者123 更新时间:2023-12-02 03:34:39 24 4
gpt4 key购买 nike

当底层对象发生更改时,JavaFx ComboBox 不会更新其所选项目。举个简单的例子:

StringProperty item1 = new SimpleStringProperty("Item-1");
StringProperty item2 = new SimpleStringProperty("Item-2");
StringProperty item3 = new SimpleStringProperty("Item-3");

ObservableList<StringProperty> items = FXCollections.observableArrayList(item1, item2, item3);

ComboBox comboBox = new ComboBox();
comboBox.setItems(items);
comboBox.getSelectionModel().select(item1);

StackPane root = new StackPane();
root.getChildren().add(comboBox);
Scene scene = new Scene(root, 300, 250);
primaryStage.setScene(scene);
primaryStage.show();

Timeline timeline1 = new Timeline(new KeyFrame(
Duration.millis(1000), ae -> {
item1.set("Changing the string");
}));
timeline1.play();

希望 ComboBox 反射(reflect)我对 item1 所做的更改。有什么办法可以做到这一点吗?

最佳答案

假设您已经在组合框中定义了单元格工厂和按钮单元格,以便列表中的元素可以很好地显示,如果您实现它以将单元格的文本属性绑定(bind)到适当的属性,它将起作用:

public static class StringPropertyCell extends ListCell<StringProperty> {

@Override
protected void updateItem(StringProperty item, boolean empty) {
super.updateItem(item, empty);
textProperty().unbind();
if (item != null && ! empty) {
textProperty().bind(item);
}
}

}

然后,显然,

ComboBox<StringProperty> comboBox = new ComboBox<>();
comboBox.setItems(items);
comboBox.getSelectionModel().select(item1);

comboBox.setCellFactory(lv -> new StringPropertyCell());
comboBox.setButtonCell(new StringPropertyCell());

否则,您需要使用extractor构建基础列表。 :

ObservableList<StringProperty> items = 
FXCollections.observableArrayList(e -> new Observable[] {e});
items.addAll(item1, item2, item3);

另请注意,您实际上可以仅使用简单的 String 列表而不是 StringProperty 列表来实现所需的效果(至少在您发布的示例代码中) s:

import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ComboBox;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.util.Duration;

public class ComboBoxTest extends Application {

@Override
public void start(Stage primaryStage) {

ObservableList<String> items = FXCollections.observableArrayList("Item-1", "Item-2", "Item-3");

ComboBox<String> comboBox = new ComboBox<>();
comboBox.setItems(items);
comboBox.getSelectionModel().select(0);

StackPane root = new StackPane();
root.getChildren().add(comboBox);
Scene scene = new Scene(root, 300, 250);
primaryStage.setScene(scene);
primaryStage.show();

Timeline timeline1 = new Timeline(new KeyFrame(
Duration.millis(1000), ae -> {
items.set(0, "Changing the string");
}));
timeline1.play();

primaryStage.setScene(new Scene(new StackPane(comboBox), 300, 100));
primaryStage.show();
}


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

关于java - 组合框不更新所选项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37594178/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com