Javafx和观察者模式 – 更新UI

 2023-02-16    405  

问题描述

我正在尝试在Javafx应用程序中实现观察者模式.我从来没有问过这里的问题,但这让我有些疯狂.

本质上,我正在尝试使用观察者模式来监视正在解析电话号码的类,并在解析文件时自动更新UI.

Javafx和观察者模式 – 更新UI

在我提出问题之前,这是我的代码:

抽象类观察者.java

public abstract class Observer 
{
   public PhoneBook numbers;

   public abstract void update();
}

我有一个实现这一点的课程:

public class PhoneBookObserver extends Observer {

    public PhoneBookObserver(PhoneBook numbers)
    {
        this.numbers = numbers;
        this.numbers.attach(this);
    }

    @Override
    public void update()
    {
        System.out.println(""NUMBER - : " + numbers.GetNumbers());

    }
}

在班上进行解析,我创建了一个新的PhonebookObserver

public PhoneBook ParsePhoneBook() 
{   
    PhoneBook nums= new PhoneBook();
    PhoneBookObserver p = new PhoneBookObserver(nums);

    // ... Parsing of file - works fine

   return nums;
}

当前运行,我的phonebookobserver中的我的println已输出.

我的问题是:

  • PhoneBookObserver的更新方法可以为我更新我的UI吗?它如何访问我的控制器中的Javafx元素?
  • 我可以让控制器成为观察者,覆盖update()并使用它来从控制器内部更新我的UI元素吗?那不好吗?

推荐答案

要直接回答您的问题,我可能会在控制器中实现Observer作为内部类.然后它可以访问控制器中的所有内容.

在此处假设PhoneBook定义了形式的方法

public List<PhoneNumber> getPhoneNumbers() ;

然后您可以做:

public class Controller {

    @FXML
    private ListView<PhoneNumber> phoneNumberList ;

    private PhoneBook numbers = new PhoneBook() ; // or initialize from elsewhere

    public void initialize() {
        numbers.attach(new PhoneBookObserver(numbers));
        // ...
    }

    private class PhoneBookObserver extends Observer {

        PhoneBookObserver(PhoneBook numbers) {
            this.numbers = numbers ;
        }

        @Override
        public void update() {
            phoneNumberList.getItems().setAll(numbers.getPhoneNumbers());
        }
    }
}

请注意,在

public abstract class Observer 
{
   public PhoneBook numbers;

   public abstract void update();
}

字段numbers确实没有目的,因为唯一的方法不使用它.因此,您可以将其删除(子类可以根据需要定义这样的字段).然后,您也可以使其成为一个接口,并且由于它只有一种方法,因此是@FunctionalInterface:

@FunctionalInterface
public interface Observer {
    public void update() ;
}

现在可以使用lambda表达式实现,因此实现非常薄,以至于您基本上停止在”访问UI”的任何问题上:

public class Controller {

    @FXML
    private ListView<PhoneNumber> phoneNumberList ;

    private PhoneBook numbers = new PhoneBook() ; // or initialize from elsewhere

    public void initialize() {
        numbers.attach(() -> phoneNumberList.getItems().setAll(numbers.getPhoneNumbers());
        // ...
    }

}

最后,请注意,和可观察的列表基本上已经提供了观察者模式的实现,因此您几乎可以在此处重新发明轮子.你可以只有

public class PhoneBook {

    private final ObservableList<PhoneNumber> numbers;

    public ObservableList<PhoneNumber> getPhoneNumbers() {
        return numbers ;
    }
}

,然后

public class Controller {

    @FXML
    private ListView<PhoneNumber> phoneNumberList ;

    private PhoneBook numbers = new PhoneBook() ; // or initialize from elsewhere

    public void initialize() {
        phoneNumberList.setItems(numbers.getPhoneNumbers());
    }

}

和列表视图将为您观察(已经观察到的)数字列表.您的Observer或PhoneBookObserver.

没有真正的需求

以上所述是小编给大家介绍的Javafx和观察者模式 – 更新UI,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!

原文链接:https://77isp.com/post/34021.html

=========================================

https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。