2023-02-16 383
当我更改基础可观察的阵列列表时,图形选择框不会更新.例如,我在这里看到的建议必须有一个更新的解决方案:例如:
javafx:listView的更新,如果expervableStbableSterview的更新/a>
int selected = productsChoiceBox.getSelectionModel().getSelectedIndex();
Product prod = products.get(selected);
prod.setName(productName.getText());
prod.setUrl(productUrl.getText());
有什么想法吗?我想避免删除和添加.
“标准”答案是将ObservableList与extractor一起使用.但是,当我对此进行测试时,它的行为并没有像广告宣传那样,而且似乎有一个错误(我猜想ChoiceBox ChoiceBox无法正确处理wasUpdated类型的更改在其ListChangedListener中发射)将在Jira举报. 更新:提交的报告,网址为 https://javafx-jira.kenai.kenai.kenai.kenai.kenai .com/browse/rt-38394
工厂方法 FXCollections.observableArrayList(Callback) 创建一个(空)可观察的数组列表.提供的Callback是将列表中的每个元素映射到Observable s数组的函数.列表将听众注册这些可观察到的侦听器,如果这些属性更改,则列表将向其侦听器更新通知.
这会用ChoiceBox产生奇怪的结果.一种可能的解决方法是使用ComboBox似乎正常工作.
这是一些示例代码.选择一个项目:然后输入文本字段,然后按Enter更改所选项目的名称.将ChoiceBox更改为ComboBox以查看正确的行为:
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import javafx.application.Application;
import javafx.beans.Observable;
import javafx.beans.binding.Bindings;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.ChoiceBox;
import javafx.scene.control.TextField;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class ChoiceBoxUpdateExample extends Application {
@Override
public void start(Stage primaryStage) {
ChoiceBox<Item> choiceBox = new ChoiceBox<>();
ObservableList<Item> items = FXCollections.observableArrayList(
item -> new Observable[] {item.nameProperty()}); // the extractor
items.addAll(
IntStream.rangeClosed(1, 10)
.mapToObj(i -> new Item("Item "+i))
.collect(Collectors.toList()));
choiceBox.setItems(items);
TextField changeSelectedField = new TextField();
changeSelectedField.disableProperty()
.bind(Bindings.isNull(choiceBox.getSelectionModel().selectedItemProperty()));
changeSelectedField.setOnAction(event ->
choiceBox.getSelectionModel().getSelectedItem().setName(changeSelectedField.getText()));
BorderPane root = new BorderPane();
root.setTop(choiceBox);
root.setBottom(changeSelectedField);
Scene scene = new Scene(root, 250, 150);
primaryStage.setScene(scene);
primaryStage.show();
}
public static class Item {
public final StringProperty name = new SimpleStringProperty();
public StringProperty nameProperty() {
return name ;
}
public final String getName() {
return nameProperty().get();
}
public final void setName(String name) {
nameProperty().set(name);
}
public Item(String name) {
setName(name);
}
@Override
public String toString() {
return getName();
}
}
public static void main(String[] args) {
launch(args);
}
}
正确和正确的答案来自james_d,但是如果您真的想使用选择框,请尝试添加和删除:
int selected = productsChoiceBox.getSelectionModel().getSelectedIndex();
products.remove(selected);
products.add(selected, prod);
我不认为这是正确的方法,但是我对其进行了测试,并且确实有效. ChoiceBox保留在删除和选定的索引上,看起来像更新.
以上所述是小编给大家介绍的JavaFX的Choiceox变化没有更新图形,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/33971.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态