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