java将对象从JFrame传递到JPanel

java将对象从JFrame传递到JPanel,java,swing,netbeans,constructor,pass-by-reference,Java,Swing,Netbeans,Constructor,Pass By Reference,我正在用Java开发一个独立的应用程序,使用NetBeans,通过串行端口获取和发送数据。我正在使用一个名为java simple Serial connector的伟大的串行通信API 请下载我创建的以下NetBeans项目: 即使没有netbeans,您仍然可以查看代码 上面是一个小的示例项目,我用来解释我希望实现的目标。该示例包含一个包含main方法的JFrame。此JFrame包含2个面板:一个带有导航按钮的面板,以及一个使用CardLayout显示面板1和面板2的面板 在JFram

我正在用Java开发一个独立的应用程序,使用NetBeans,通过串行端口获取和发送数据。我正在使用一个名为java simple Serial connector的伟大的串行通信API

请下载我创建的以下NetBeans项目: 即使没有netbeans,您仍然可以查看代码

上面是一个小的示例项目,我用来解释我希望实现的目标。该示例包含一个包含main方法的JFrame。此JFrame包含2个面板:一个带有导航按钮的面板,以及一个使用CardLayout显示面板1和面板2的面板

在JFrame中,我有一个使用JSSCAPI的getPortNames()方法获取端口名列表的方法。我的问题是,如何将这些端口名字符串值从JFrame传递到Panel 1,而不使用以下命令,因为它将无法工作: MyJFrame MyJFrame=新的MyJFrame(); myjframe.getPortNames()

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

在面板1的代码自定义程序中添加“this”

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

我想知道您是否应该将端口名保存在非GUI模型类中,并从该类而不是从“JFrame”中获取,但不管怎样,您的问题是一个更一般问题的具体示例:如何将信息从一个GUI对象传递到另一个GUI对象,这可以进一步推广到:如何将信息从一个对象传递到另一个对象

简单的答案是让一个对象在另一个对象上调用一个方法,这是您已经尝试过的,也应该是有效的,但是您尝试的问题是您在错误的对象上调用了它。您有一个已经构造好的JFrame对象,它是可见的,并且保存了您需要的信息,这是您应该调用方法的对象,而不是新的JFrame对象。确保新对象是从同一个类构建的,但要理解它与所显示的对象(即您想要的对象)是完全不同的对象

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

例如,假设有一个名为FooFrame的类扩展了JFrame,它包含一个扩展了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
)传递给它


请不要在链接中发布代码。如果你有相关的代码,在这里贴上代码标签。否则,我们可能无法为您提供具体帮助。+1感谢您的解释。冷静而细致。令人印象深刻:-)非常感谢您的精彩解释。“我今天会试试这个,让你知道它是怎么回事。”装满鳗鱼的气垫船亲爱的朋友,我已经试着实施你的建议,但没有成功。你能读一下我在气垫船上的问题吗?我在那里解释了我面临的问题?谢谢。@jadrijan:您更改了Panel1的构造函数吗?@jadrijan:不客气。您需要研究使用“模型-视图-控件”模式或MVC。请在Wikipedia上查找,并在stackoverflow上搜索示例(例如,我的示例)。
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();
   }
}