如何一次更新所有JavaFX元素?

问题描述 投票:0回答:1

我有一个简单的javaFX应用程序,包含一些Comboboxes和Textareas。

Combobox1拥有来自arraylist的所有客户。当我通过buttonclick删除客户端时,它会从列表中删除此客户端,所有其他fx元素(如Textareas和comboboxes)应该应用此更改。

我的方法是再次为每个元素加载客户端列表。例如

clientTextArea.setText(MyClass.getAllclients());

当我为2个fx元素执行此操作时,这是可以的,但它会变得超级混乱10或100.通知所有其他相关fx元素重新加载clientarray的正确方法是什么?

    public class Worker {

    private String name;

    public Worker(String name){
        this.name = name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public String getName(){
        return name;
    }
}

public class Work {

    private ArrayList<Worker> workerList = new ArrayList<>();

    public void addWorker(Worker worker){
            workerList.add(worker);
    }

    public boolean removeWorker(Worker worker) {
        for(Worker work: workerList) {
            if(worker.equals(work)){
                workerList.remove(work);
                return  true;
            }
        }
        return false;
    }
}

public class WorkerFX {

    Work work = new Work();

    @FXML
    private Button add, remove;

    @FXML
    private ComboBox<Worker> workerComBobox;

    @FXML
    private TextArea workerTextArea;

    @FXML
    private TextField workerTextField;

    public void addWorker(){
       Worker newWorker = new Worker(workerTextField.getText());
       work.addWorker(newWorker);
       workerComBobox.getItems().add(newWorker);
       //now the Textfield schould automaticly also add the Worker too
    }

}
java javafx
1个回答
2
投票

将您的列表声明为ObservableList然后添加一个监听器,其中包含控件的所有必要更新。就像是:

ObservableList<SomeClass> myList = FXCollections.observableArrayList();

myList.addListener(l -> {
    // do what you need with your controls here   
});

如果您有10个或100个元素,则仍需要明确定义其更新行为。这是不可避免的,但通过这样做,您无需担心在不同的更改源上调用更新。

某些控件(如ComboBox)会显示items属性,您可以将其绑定到列表而不是在侦听器中更新它。 Here's a guide to JavaFX property binding。无论哪种方式,您仍然需要在某处明确定义每个控件的更新行为。

© www.soinside.com 2019 - 2024. All rights reserved.