Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 有人能用我的例子解释一下如何从静态设置文本吗?_Java_Get_Set - Fatal编程技术网

Java 有人能用我的例子解释一下如何从静态设置文本吗?

Java 有人能用我的例子解释一下如何从静态设置文本吗?,java,get,set,Java,Get,Set,首先,我想说,我现在只使用java一个月了。这可能是一个相当简单的问题。我搜索了一下,发现经典的水果示例对我来说毫无意义。我花了几个小时研究它,试图找出如何应用它使它工作。这对我来说没有任何意义,因为每个人都解释了如何使用2行代码和无结构语句获取和设置属性。我真的很希望能从静态到非静态的对话 我想在OBD2nerForm类的文本框中设置一个单独的静态类中的文本 public class OBD2nerForm extends java.awt.Frame { /** Creates new f

首先,我想说,我现在只使用java一个月了。这可能是一个相当简单的问题。我搜索了一下,发现经典的水果示例对我来说毫无意义。我花了几个小时研究它,试图找出如何应用它使它工作。这对我来说没有任何意义,因为每个人都解释了如何使用2行代码和无结构语句获取和设置属性。我真的很希望能从静态到非静态的对话

我想在OBD2nerForm类的文本框中设置一个单独的静态类中的文本

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