【问题标题】:java pass object from JFrame to JPaneljava将对象从JFrame传递到JPanel
【发布时间】:2012-02-28 00:31:38
【问题描述】:

我正在使用 NetBeans 在 Java 中开发一个独立的应用程序,它通过串行端口获取和发送数据。我正在使用一个很棒的 AP​​I 进行串行通信,称为 java 简单串行连接器 http://code.google.com/p/java-simple-serial-connector/

请下载我创建的以下 NetBeans 项目: http://netload.in/dateiN9xmwRtn19.htm 即使您没有 netbeans,您仍然可以查看代码。

以上是我制作的一个小示例项目,用于解释我希望完成的任务。该示例包含一个包含 main 方法的 JFrame。此 JFrame 包含 2 个面板:一个带有导航按钮的面板,以及一个使用 CardLayout 显示面板 1 和面板 2 的面板。

在 JFrame 中,我有一个使用 jssc API 的 getPortNames() 方法获取端口名称列表的方法。我的问题是,如何将这些端口名称字符串值从 JFrame 传递到我的面板 1,而不使用以下内容,因为它不起作用: MyJFrame myjframe = new MyJFrame(); myjframe.getPortNames();

装满鳗鱼的气垫船 再次非常感谢您的解释,值得一提。我现在意识到我的问题是 NetBeans 而不是 Java。我对它还不够熟悉,但由于我的项目的规模和复杂性,我仍然更喜欢使用它。我在下面上传了另外 2 个屏幕截图,显示了我如何尝试将 JFrame 对象的“this”引用传递给 NetBeans 中的 JPanel 对象。正如您在 MyJFrame.java 屏幕截图中所见,NetBeans 已将“this”引用标记为错误。你能帮我解决这个问题吗?此外,在您解释的第一句话中,您提到串行端口方法应该在一个单独的类中,而不是在 JFrame 中,因为它们是非 GUI 方法。我完全同意你的看法,我更愿意这样做,因为它是正确的面向对象的方法。但是这样做,我在 NetBeans 中再次面临同样的问题。我现在如何将对象引用从 SerialPorts.java 类传递给 JFrame、JPanel 等,这样我就不会一直创建新的 SerialPorts 对象,记住我需要连接一直保持打开状态(例如,没有使用 SerialPorts sp = new SerialPorts();)。非常感谢您的帮助。

在面板 1 的代码定制器中添加“this”

MyJFrame.java - 编辑器下划线将“this”引用为错误

【问题讨论】:

  • 请不要在链接中发布代码。如果您有相关代码,请在此处使用代码标签发布。否则我们可能无法为您提供具体帮助。

标签: java swing netbeans constructor pass-by-reference


【解决方案1】:

我想知道您是否应该拥有非 GUI 模型类并从它而不是从“JFrame”中获取的端口名称,但不管您的问题是一个更普遍的问题的具体示例:如何您将信息从一个 GUI 对象传递到另一个,这可以进一步概括为:您如何将信息从一个对象传递到另一个对象。

简单的答案是让一个对象调用另一个对象的方法,这是您尝试过的方法,并且应该可行,但是您尝试的问题是您在错误的对象上调用它.您有一个已经构建的 JFrame 对象,它是可见的,并且包含您需要的信息,并且 that 是您应该调用您的方法的对象,而不是 new JFrame 对象。当然,新对象是从同一个类构建的,但要了解它与显示的对象是完全不同的对象,即您想要的对象。

所以现在你的问题归结为这个——我如何将可视化的 JFrame 引用到另一个对象中?有很多方法可以做到这一点,但最简单的方法可能是通过构造函数或方法参数将一个类的引用传递给另一个类。

...

例如,假设您有一个扩展 JFrame 的名为 FooFrame 的类,并且它包含一个扩展 JPanel 的 FooPanel 对象,并假设您希望 FooPanel 对象调用 FooFrame 的 someMethod() 方法:

public class FooFrame extends JFrame {

   public String someMethod() {
      return myTextField .getText();
   }
}

您可以让 FooPanel 创建一个新的 FooFrame 对象并在您尝试执行此操作时调用此方法:

class FooPanel extends JPanel {

   public void otherMethod() {
      FooFrame fooFrame = new FooFrame();
      fooFrame.someMethod();
   }
}

但是你遇到了和上面一样的问题。此处创建的 FooFrame 对象不是正在显示的对象,因此 JTextField 的内容将为空且没有多大帮助。我建议的解决方案是通过构造函数参数将原始 JFrame 的引用传递给 JPanel,如下所示:

class FooPanel extends JPanel {
   private FooFrame fooFrame;

   // constructor accepts a reference to a FooFrame object
   public FooPanel(FooFrame fooFrame) {
      this.fooFrame = fooFrame; // and sets its field with it
   }

   public void otherMethod() {
      // no longer needed!
      // FooFrame fooFrame = new FooFrame(); 


      // now method is called on the right object!
      fooFrame.someMethod(); 
   }
}

然后您可以在 FooFrame 中创建您的 FooPanel 对象并将 FooFrame 对象 (this) 传递给它。

public class FooFrame extends JFrame {

   private JTextField myTextField = new JTextField(10);
   private FooPanel fooPanel;

   public FooFrame() {
      // the current FooFrame object is this!
      fooPanel = new FooPanel(this);
      add(fooPanel);
   }

   public String someMethod() {
      return myTextField .getText();
   }
}

【讨论】:

  • +1 表示您解释的方式。冷静和细节。令人印象深刻:-)
  • 非常感谢您的出色解释。我今天会试试这个,然后告诉你它是怎么回事。
  • @Hovercraft Full Of Eels 亲爱的朋友,我已尝试实施您的建议,但未成功。您能否从充满鳗鱼的气垫船部分阅读我的问题,我在其中解释了我面临的问题?谢谢。
  • @jadrijan:你改变了 Panel1 的构造函数吗?
  • @jadrijan:不客气。您需要考虑使用“模型-视图-控制”模式或 MVC。在 Wikipedia 上查找此内容,并在 stackoverflow 上搜索示例(例如,我的示例 here)。
猜你喜欢
  • 1970-01-01
  • 2021-09-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-08
  • 2023-03-25
相关资源
最近更新 更多