【问题标题】:How to update all JavaFX elements at once?如何一次更新所有 JavaFX 元素?
【发布时间】:2018-12-02 15:08:53
【问题描述】:

我有一个带有一些组合框和文本区域的简单 javaFX 应用程序。

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

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

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
    }

}

【问题讨论】:

  • 您不应该在 for-each 循环中修改列表本身(您的 removeWorker)。在您的情况下,它可以工作,因为您立即从该方法返回,但这通常会引发异常。

标签: java javafx


【解决方案1】:

将您的列表声明为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。无论哪种方式,您仍然需要在某处显式定义每个控件的更新行为。

【讨论】:

  • 非常感谢。我明白了这个概念,但我还有另一个问题。我的客户列表是我的 ClientHandler 类中的一个字段。如何将此列表绑定到可观察对象,以便可观察列表的每次更改都是我的 ClientHandler 类中客户端列表的直接更改?
  • 使用 bindBidirectional 我可以绑定所有 textpropertys 并在我更改一个时使它们全部更改,但是 Observable 列表有没有办法将它链接到我的其他类中的列表?这有意义吗?
  • @QickdmGdombu 您能否编辑您的问题以包含您想要实现的目标的示例?
  • 完成了,希望现在更清楚了,抱歉。我希望每次发生变化时,例如在 Worker 数组列表中添加了一个新的工作人员或删除了另一个工作人员,textarea 和组合框都应该更新,或者换句话说,只显示工作人员 Arraylist 中的内容
猜你喜欢
  • 2023-04-01
  • 1970-01-01
  • 2019-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-09
  • 1970-01-01
  • 2016-02-06
相关资源
最近更新 更多