2023-02-16 405
我正在尝试在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已输出.
我的问题是:
要直接回答您的问题,我可能会在控制器中实现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/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态