Java在不相关的类之间创建事件

时间:2014-02-13 16:29:46

标签: java events

您好我想知道创建链接两个不相关类的事件的最简单(或更少扭曲)的方法。

假设我有以下方案:(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。我怎样才能绕过这种情况?

2 个答案:

答案 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)

既然你问过最简单的方式,那么这就是实现类之间紧密耦合的方法,因此很简单:

  1. FirstThing中创建一个公共方法SetLab2Text(...)
  2. SecondThing中创建一个类变量来保存对FirstThing实例的引用:FirstThing ft = new FirstThing();它假定FirstThing的默认构造函数只是初始化类变量并且没有实现任何GUI的东西。
  3. ActionListener but添加ft.SetLab2Text("Hello");
  4. 同样,这只是一种快速而又肮脏的方式来完成您的任务,并且代表一个好的设计。