【问题标题】: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 选项 :)

标签: java swing


【解决方案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
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-07
  • 2019-07-13
相关资源
最近更新 更多