您好我想知道创建链接两个不相关类的事件的最简单(或更少扭曲)的方法。
假设我有以下方案:(a - > b表示包含b)
class ZeroThing extends JPanel container1
-> class FirstThing extends JPanel container1.1
-> JProgressBar bar
-> JButton but
-> class SecondThing extends JPanel container1.2
-> JLabel lab1
-> JLabel lab2
我希望每次按下按钮时都会自动将一封信添加到lab2中。 将事件链接到lab2的最简单方法是什么?
编辑:我想做什么:
but.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
lab2.setText("Hello");
}
});
这不起作用,因为它是FirstThing类中包含的JButton,而lab2是SecondThing类中包含的JLabel。我怎样才能绕过这种情况?
答案 0 :(得分:0)
你应该考虑模型 - 视图 - 控制器(MVC)设计。
在这种情况下,你的Label是一个View,你的Button是一个Controller,你还没有定义一个模型 - 但你应该这样做。
模型包含您要更改的数据。按下按钮时,它会在模型上调用一些set
方法(甚至可以调用addLetter()
)
当模型接收到数据更改时,它应该向正在侦听模型的所有视图触发事件。这意味着该模型还需要addModelListener()
和removeModelListener()
以及fireLetterAdded(String letter)
方法来调用已添加到的所有letterAdded(String letter)
上的方法,例如LetterListener
模特。
当然,这意味着您需要创建一个具有LetterListener
方法的letterAdded(String letter)
接口,并且您的第二个类实现LetterListener
并将其自身添加到模型中。< / p>
这是对实现MVC的一个非常快速的概述,我已经掩盖了很多东西。但这是否足以开始?
答案 1 :(得分:0)
既然你问过最简单的方式,那么这就是实现类之间紧密耦合的方法,因此很简单:
FirstThing
中创建一个公共方法SetLab2Text(...)
。SecondThing
中创建一个类变量来保存对FirstThing
实例的引用:FirstThing ft = new FirstThing();
它假定FirstThing
的默认构造函数只是初始化类变量并且没有实现任何GUI的东西。 ActionListener
but
添加ft.SetLab2Text("Hello");
同样,这只是一种快速而又肮脏的方式来完成您的任务,并且不代表一个好的设计。