Java 有人能用我的例子解释一下如何从静态设置文本吗?
首先,我想说,我现在只使用java一个月了。这可能是一个相当简单的问题。我搜索了一下,发现经典的水果示例对我来说毫无意义。我花了几个小时研究它,试图找出如何应用它使它工作。这对我来说没有任何意义,因为每个人都解释了如何使用2行代码和无结构语句获取和设置属性。我真的很希望能从静态到非静态的对话 我想在OBD2nerForm类的文本框中设置一个单独的静态类中的文本Java 有人能用我的例子解释一下如何从静态设置文本吗?,java,get,set,Java,Get,Set,首先,我想说,我现在只使用java一个月了。这可能是一个相当简单的问题。我搜索了一下,发现经典的水果示例对我来说毫无意义。我花了几个小时研究它,试图找出如何应用它使它工作。这对我来说没有任何意义,因为每个人都解释了如何使用2行代码和无结构语句获取和设置属性。我真的很希望能从静态到非静态的对话 我想在OBD2nerForm类的文本框中设置一个单独的静态类中的文本 public class OBD2nerForm extends java.awt.Frame { /** Creates new f
public class OBD2nerForm extends java.awt.Frame {
/** Creates new form OBD2nerForm */
public OBD2nerForm() {
initComponents();
} ....................................
public String setText(String text){
this.jFormattedTextField1.setText(text);
}
我想我对这里定义的表单的这个实例有一个静态引用
public class Status {
public static OBD2nerForm form = new OBD2nerForm();
它是从我的主菜单中这样调用的
public class obd2ner {
public static void main(String[] args) throws IOException {
Status.form.main(args);
然后当我试着叫它。。Status.form.getText在创建表单时为我提供初始值。当我设置文本时,它不会更改屏幕上的文本
我只是为了保持简单而展示它。还有许多其他部分正在进行。我有一个串行端口上的静态监视器,我想让它抓取下一个要从文本框发送的数据,然后增加它
我只是不明白如何在非静态的环境中使用getter和setter。它不是我所需要的。看起来我在屏幕上看到了一个实例,它正在使用一个新实例来执行获取和设置
我试着按照我收到的答案,但它没有工作
public class OBD2nerForm extends java.awt.Frame {
String X = "";
//尝试递增代码的可运行方法
公共字符串getNewScannerValueRunnable(){
我真的需要一些其他的建议。我只是不明白这里会发生什么。您的表单创建得很好,只有一个引用,它最终会出现在那个静态变量中。所有这些都很好
Swing有一个“秘密”需要注意:除了Swing线程(也称为事件调度线程)之外,您不能(明显地)从任何线程更改GUI对象的属性
无论如何,这样做的诀窍是将属性更改代码作为Runnable
传递给SwingUtilities.invokeAndWait()
或SwingUtilities.invokeLater()
编辑: 好的,让我们备份一下。您的表单是基于AWT的,而不是基于Swing的,因此我担心我关于使用
SwingUtilities
的建议可能对您没有帮助,即使您正确地实现了它。这次我将尝试给出更具体的提示
您已经创建了一个类OBD2nerForm
,它是AWT表单。该类有一个构造函数,它调用initComponents
在屏幕上设置一些GUI组件
该类还有一个名为setText
的方法,该方法将其参数文本放入表单上的一个字段中。该方法是一个实例方法,即它不是您所称的“静态”方法
您还有另一个类,Status
,带有一个class字段form
。form
的初始值设定项调用OBD2nerForm
的构造函数。它将创建表单的一个实例并将其存储在form
中;但我还没有看到show()
或setVisible()
调用表单以实际显示它
以下是麻烦的最初迹象:
public class obd2ner {
public static void main(String[] args) throws IOException {
Status.form.main(args);
类名(如obd2ner
)应该以大写字母开头;但这是风格和惯例的问题,不是问题所在。不过,遵循惯例有助于其他人阅读和调试代码
更大的问题是obd2ner.main()
调用表单的main()
。这可以使其正常工作,但通常表明您做错了什么
虽然没有任何东西可以阻止您将静态main
方法编码到您想要的任意多个类中,但只有一个main方法可以从外部启动,即当您运行应用程序时。第一个main
基本上是程序的“boss”方法
“first main”通常实例化和初始化一些对象。在非GUI应用程序中,main()
可能会启动一个循环或其他一些控制结构,然后它会在其中协调其他对象的操作。在GUI应用程序中,main()
通常只是实例化然后显示GUI,然后结束;一旦GUI可见,所有进一步的程序活动都会由用户在GUI上执行的操作触发
没有看到您的代码,我猜Obd2nerForm.main()
还实例化了Obd2nerForm,并显示了它。因此,您可能确实有一个实例化但不可见的表单挂起了Status.form
,还有一个实例化、可见并从Obd2nerForm
中的某个变量引用。如果您想影响该GUI,您需要使对该表单的引用可访问
最简单的可能是:
在Obd2nerForm
中,声明一个公共静态Obd2nerForm表单
,并在Obd2nerForm.main
中,在调用构造函数之后,立即将对表单的引用复制到该变量中。从那时起,您可以使用例如Obd2nerForm.form.setText()
访问表单及其方法
不过,提醒一下:您似乎有两个main()
s,这需要修复。在应用程序生命周期开始时应该完成的所有工作都需要在其中一个main
s中完成,而不是几个
最后,看看这个方法调用:
Status.form.main(args);
这是在特定实例上调用方法的语法。但是Obd2nerForm.main
是一个类方法(您称之为“静态”),因此没有“特定的一个”可调用,它总是属于类本身的一个。这就是为什么调用类方法的语法类似于
Obd2nerForm.main(args);
编译器允许您以自己的方式进行编译
Obd2nerForm.main(args);