通知调用者类发生了啥事

Posted

技术标签:

【中文标题】通知调用者类发生了啥事【英文标题】:notify the caller class something has happened通知调用者类发生了什么事 【发布时间】:2012-01-22 10:02:37 【问题描述】:

假设您有一个JFrame 的子类,并使用它来创建您自己的自定义JFrame。在这个类(我们称之为mainFrame)中,我们创建一个对另一个自定义JFrame 类的引用(我们称之为sidePanel)。

sidePanel,你有不同的按钮,单选按钮,..

我的问题是,有没有办法通知mainFrame 用户按下按钮?

我已经创建了一个(未经测试的)示例来说明我的意思:

class mainFrame extends JFrame 
   public mainFrame() 
      super("main frame");
      //...........
      sidePanel panel = new sidePanel();
      //...........
   
   public static void main(String[] args) 
      mainFrame mainF = new mainFrame();
      //.........
   

还有sidePanel 类:

class sidePanel extends JFrame 

   public sidePanel() 
      super("sidePanel frame");
      //...........
      JButton button1 = new JButton();
      button1.addActionListener(new ActionListener()   
          public void actionPerformed(ActionEvent e)
            
               //Notify mainFrame somehow button is pressed
          );
      //...........
    

【问题讨论】:

"说,你有一个 JFrame 的子类,并用它来创建你自己的自定义 JFrame。在这个类中(我们称之为 mainFrame,我们创建一个对另一个自定义 JFrame 的引用..” 这是两句话中的两个设计错误。真好!1)一个应用程序。通常需要对框架的引用,而不是扩展框架的类。 2) 不要使用超过一帧。显示其余内容有多种选择。 @AndrewThompson 好吧,我只是想制作一个带有主框架和侧框架的应用程序,如 GIMP 或许多其他绘画程序。只使用 2 个 JFrame 是最简单的事情。你有什么建议呢?我愿意接受其他想法。 "like GIMP" GIMP 经常被视为我们不应该将多帧应用程序强加给(不幸的)最终用户的经典示例。 “我愿意接受其他想法。” 1) 一个 JFrame 拥有许多 JDialog 实例。 2) 一个JDesktopPane 有许多JInternalFrame 实例 3) 一个JFrame 有许多可浮动的JToolBar 实例.. 其他建议:JSplitPane,侧窗格...在一边。 感谢您的提示,我选择了 JToolBar 选项 :) 【参考方案1】:

要通知mainFrame 一个事件,SidePanel 实例(对于 Frame 来说真是个坏名字)必须引用 mainFrame。将mainFrame 作为SidePanel 构造函数的参数传递,并从SidePanel 中的actionPerformed 方法回调mainFrame

SidePanel panel = new SidePanel(this);

在侧面板中:

public void actionPerformed(ActionEvent e) 
    mainFrame.buttonHasBeenClicked();
    ...

不过,这将两个类紧密结合在一起。一种解耦它们的方法是使 SidePanel 对象接受自定义事件的侦听器,并在单击按钮时触发此类事件。 mainFrame 将构造 SidePanel 实例,并将其自身(或内部匿名类实例)作为侦听器添加到 sidePanel。

有关示例,请参阅 this page。

【讨论】:

感谢您的回答和链接,但还有其他方法(例如线程)吗?谢谢 Swing 应用程序中的所有事件处理代码都在事件调度线程中执行。无论如何,线程用于并行执行多个任务,而不是对象之间的通信。我看不出线程与您的问题有什么关系。 +1 表示EventListenerList;另请参阅answer。

以上是关于通知调用者类发生了啥事的主要内容,如果未能解决你的问题,请参考以下文章

为啥任务取消发生在调用者线程上?

NIO,AIO,BIO

同步与异步,阻塞与非阻塞

第十六周

常用I/O模型及比较说明

第十六周学习作业