List 如何在JavaFX中将ComboBox绑定到列表?
我的应用程序使用线程定期向列表添加字符串。我想在将这些字符串添加到列表后,立即将其添加到组合框中。是否仍然可以将组合框绑定到列表 我的代码:List 如何在JavaFX中将ComboBox绑定到列表?,list,javafx,combobox,bind,List,Javafx,Combobox,Bind,我的应用程序使用线程定期向列表添加字符串。我想在将这些字符串添加到列表后,立即将其添加到组合框中。是否仍然可以将组合框绑定到列表 我的代码: static final int max = 20; List<String> ips = new ArrayList<String>(); public void getIP() throws UnknownHostException { Task task = new Task<Void>() {
static final int max = 20;
List<String> ips = new ArrayList<String>();
public void getIP() throws UnknownHostException {
Task task = new Task<Void>() {
@Override
public Void call() throws UnknownHostException {
InetAddress localhost = InetAddress.getLocalHost();
byte[] ip = localhost.getAddress();
for (int i = 10; i <= max; i++) {
if (isCancelled()) {
break;
}
try {
ip[3] = (byte) i;
InetAddress address = InetAddress.getByAddress(ip);
if (address.isReachable(100)) {
//============================== Populating List ===============//
ips.add(address.getHostName());
}
} catch (Exception e) {
System.err.println(e);
}
updateProgress(i, max);
}
return null;
}
};
//============================== Bind ComboBox to List Code here ===============//
indicator.progressProperty().bind(task.progressProperty());
new Thread(task).start();
}
static final int max=20;
List ips=new ArrayList();
public void getIP()抛出未知的hostException{
任务=新任务(){
@凌驾
public Void call()抛出UnknownHostException{
InetAddress localhost=InetAddress.getLocalHost();
字节[]ip=localhost.getAddress();
对于(int i=10;i否),无法绑定一个简单的列表,因为它是不可观察的。即使使用可观察列表
,也会出现来自不同线程的更新问题
但是,您可以使用同步列表并使用value属性传递当前大小,这将允许您通过侦听器添加项目
示例
这使用了一个ListView
而不是ComboBox
,因为结果在没有用户交互的情况下是可见的,但是您也可以使用targetList=ComboBox.getItems()
不,没有办法绑定一个简单的列表,因为它是不可观察的。即使使用可观察列表
,也会出现来自不同线程的更新问题
但是,您可以使用同步列表并使用value属性传递当前大小,这将允许您通过侦听器添加项目
示例
这使用了一个ListView
而不是ComboBox
,因为结果在没有用户交互的情况下是可见的,但是您也可以使用targetList=ComboBox.getItems()
我建议您执行以下操作:
改变
List<String> ips = new ArrayList<String>();
List ips=new ArrayList();
到
final observeList ips=FXCollections.observearraylist();
更改:
Task task = new Task<Void>()
Task Task=新任务()
到
任务我建议您执行以下操作:
改变
List<String> ips = new ArrayList<String>();
List ips=new ArrayList();
到
final observeList ips=FXCollections.observearraylist();
更改:
Task task = new Task<Void>()
Task Task=新任务()
到
task我使用了Platform.runLater,它可以正常工作。但是我遇到了一个奇怪的问题,如果在填充ComboBox时打开它,它一次只显示一个可见项,并将其他项添加到一个滚动列表中。但是,如果我在线程完成后打开ComboBox,它会显示所有项,而不显示滚动列表。我使用了Platform、 运行稍后,它就可以工作了。但是我遇到了一个奇怪的问题,如果我在填充ComboBox时打开了它,它一次只显示一个可见的项目,并将其他项目添加到滚动列表中。但是,如果我在线程完成后打开ComboBox,它会显示所有项目,而不显示滚动列表。
Task task = new Task<Void>()
Task<ObservableList<String> task = new Task<>(){
@Override
public ObservableList<String> call() throws UnknownHostException {
...
return ips;
}
};
comboBox.itemsProperty().bind(task.valueProperty());