java从JFrame传递对象到JPanel

我正在使用NetBeans在Java中开发一个独立的应用程序,它通过串行端口获取和发送数据。 我正在使用一个很棒的串行通信API,称为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传递到我的Panel 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();)。 非常感谢你的帮助。

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

MyJFrame.java – 编辑器将“this”引用为错误 MyJFrame.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 )传递给它。

 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(); } }