Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
List 如何在JavaFX中将ComboBox绑定到列表?_List_Javafx_Combobox_Bind - Fatal编程技术网

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());