Java 通知调用方类发生了什么事情

Java 通知调用方类发生了什么事情,java,swing,Java,Swing,比如说,您有一个子类JFrame,并使用它创建您自己的自定义JFrame。在这个类中(我们称之为大型机),我们创建了对另一个自定义JFrame类的引用(我们称之为侧面板) 在侧面板中,您有不同的按钮、单选按钮 我的问题是,有没有一种方法可以通知用户按下按钮的主机 我创建了一个(未经测试的)示例来说明我的意思: class mainFrame extends JFrame { public mainFrame() { super("main frame"); //..

比如说,您有一个子类
JFrame
,并使用它创建您自己的自定义
JFrame
。在这个类中(我们称之为
大型机
),我们创建了对另一个自定义
JFrame
类的引用(我们称之为
侧面板

侧面板中
,您有不同的按钮、单选按钮

我的问题是,有没有一种方法可以通知用户按下按钮的主机

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

class mainFrame extends JFrame {
   public mainFrame() {
      super("main frame");
      //...........
      sidePanel panel = new sidePanel();
      //...........
   }
   public static void main(String[] args) {
      mainFrame mainF = new mainFrame();
      //.........
   }
}
侧面板
类:

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
          }});
      //...........
    }
}

若要将事件通知
大型机
侧面板
实例(对于帧而言,名称非常糟糕)必须具有对
大型机
的引用。将
mainFrame
作为侧面板构造函数的参数传递,并从侧面板中的
actionPerformed
方法回调
mainFrame

SidePanel panel = new SidePanel(this);
public void actionPerformed(ActionEvent e) {
    mainFrame.buttonHasBeenClicked();
    ...
}
在侧面板中:

SidePanel panel = new SidePanel(this);
public void actionPerformed(ActionEvent e) {
    mainFrame.buttonHasBeenClicked();
    ...
}
不过,这两个类紧密结合在一起。将它们解耦的一种方法是使侧面板对象接受自定义事件的侦听器,并在单击按钮时触发此类事件。大型机将构造侧面板实例,并将自身(或内部匿名类实例)作为侦听器添加到侧面板


例如,请参阅。

“假设您有一个子类JFrame,并使用它创建您自己的自定义JFrame。在这个类中(我们称之为mainFrame,我们创建了对另一个自定义JFrame的引用…”这是两个设计错误,共两句话。很好!1)一个应用程序。通常需要对框架的引用,而不是扩展框架的类。2) 不要使用多个框架。除了显示其余内容外,还有多种选择。@AndrewThompson好吧,我只是想制作一个带有主框架和侧框架的应用程序,比如GIMP或其他许多绘画程序。仅仅使用2个JFrames是最简单的事情。你有什么建议?我对其他想法持开放态度。“喜欢GIMP”GIMP通常被定位为一个经典的例子,说明为什么我们不应该将多帧应用程序强加给(不幸的)最终用户。“我对其他想法持开放态度。”1)一个拥有许多
JDialog
实例的
JFrame
。2) 一个
JDesktopPane
有许多
JInternalFrame
实例3)一个
JFrame
有许多可浮动
JToolBar
实例..其他建议:一个带侧窗格的JSplitPane。。。另一方面,谢谢你的提示,我选择了JToolBar选项:)谢谢你的回答和链接,但是还有其他方法吗(比如线程)?Swing应用程序中的ThanksAll事件处理代码在事件调度线程中执行。无论如何,线程是用来并行执行多个任务的,而不是在对象之间进行通信。我看不出线程与您的问题有多大关系。
EventListenerList的+1;另见此。