【问题标题】:Java setVisible from one JFrame class to another?Java setVisible 从一个 JFrame 类到另一个?
【发布时间】:2013-09-16 07:01:07
【问题描述】:

我有一个主要的JFrame,它创建了一个基本通知 JFrame 类的实例。

从我的主要JFrame 创建通知的代码如下所示:

new Notification(from, msg, time);

我想知道我如何从我的通知类中访问我的主要JFrame。基本上我想在我的通知类中更改主要JFrame 上某些组件的 setVisible。

编辑

我的 client.java (main JFrame) 调用通知

public JPanel pnlMidMenuButtons;
/**** code... **/
Notification ntf = new Notification(from, msg, time); // Further down the notification is being called

导入界面:

公共类 ImportUI 扩展客户端实现 NotificationParent {

public void setImportantFieldsVisible(boolean visible) {
    pnlMidMenuButtons.setVisible(visible);
}

}

NotificationParent:

public interface NotificationParent {
    public void setImportantFieldsVisible(boolean visible);
    public void setAgentName(String agentName);
}

还有我的通知类:

public class Notification extends JFrame {

    private NotificationParent parent;
    /*...*/

    public Notification(NotificationParent parent, String from, String msg, Date time) {
        this.parent = parent;
        parent.setImportantFieldsVisible(false); // Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
    }

}

任何想法是什么导致了异常?

【问题讨论】:

  • 我强烈建议您不要允许您之外的任何课程框架对其内容进行足够的访问。相反,我可能会考虑使用某种interface,您可以实现它来公开需要实现的功能。这可以防止Notification 类去邮寄和做不应该的事情到主窗口。然后,您只需提供与接口相同类型的参数并将实现的引用传递给它...
  • @MadProgrammer 听起来是一个非常好的解决方案。如何实现这样的接口?不太确定我是否遵循逻辑

标签: java swing jframe


【解决方案1】:

实际答案取决于您的需求,但我会创建一个interface(如果您想为某些对象而不是其他对象提供某些功能,甚至可以创建一系列接口)。

public interface NotificationParent {
    public void setImportantFieldsVisible(boolean visible);
}

然后我会在调用者上实现这个接口...

public class ImportUI extends ... implements NotificationParent {
    /*...*/
    public void setImportantFieldsVisible(boolean visible) {
        //....
    }
}

然后我会从一个附加参数到Notification,这样它就可以接受NotificationParent的引用...

public class Notification extends ... {

    private NotificationParent parent;
    /*...*/

    public Notification(NotificationParent parent, String from, String msg, Date time) {
        this.parent = parent;
        /*...*/
    }

}

然后,如果您需要,您只需调用一种可用的方法来满足您的要求。

现在您显然可以拥有更多方法,但这取决于您的要求...

【讨论】:

  • Notification 应该扩展什么?
  • 无论你需要什么来扩展它......这是一个例子;)
  • 好的 :) public class ImportUI extends ... 应该扩展我调用 Notification 类的类?
  • 开始获取;当我想从接口 id 调用方法时,就像; parent.setImportantFieldsVisible(false); ?
  • 是的。就我个人而言,我会设置“组”或“批处理”方法,允许您从方法中影响多个字段的状态,或者设置某种状态标志,允许父级决定最佳响应给定的状态,但这取决于你;)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-12
  • 2014-10-07
  • 1970-01-01
相关资源
最近更新 更多