java - 有人可以使用我的示例解释如何从静态setText吗?

标签 java get set

首先,我想说的是,我现在仅使用Java工作了1个月。这可能是一个非常简单的问题。我搜索了一下,发现经典的水果例子对我来说没有任何意义。我花了几个小时研究它,试图弄清楚如何应用它以使其工作。这对我来说没有任何意义,因为每个人都说明了如何使用两行代码且没有结构语句来获取和设置属性。对于如何从静态与非静态进行交谈,我将不胜感激。

我想从单独的静态类的OBD2nerForm类的文本框中设置setText。

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为我提供了初始值。当我setText时,它不会更改屏幕上的那个。

我只是为了简单起见显示它。还有许多其他部分。我在串行端口上有一个静态监视器,我希望它捕获要从文本框中发送的下一个数据,然后对其进行递增。

我只是不明白如何在非静态方法上使用getter和setter。它并没有完全按照我的需要去做。好像我在屏幕上看到一个实例,并且它正在使用一个新实例来执行获取和设置。

我按照收到的答案尝试了此操作,但没有成功...

public class OBD2nerForm extends java.awt.Frame {
      String X = "";


//尝试增加代码的可运行方法
    公共字符串getNewScannerValueRunnable(){

    Runnable doWorkRunnable = new Runnable() {

        @Override
        public void run() { 
           Status.form.getNewRotatingValue()
        ;}

    };
        SwingUtilities.invokeAndWait(doWorkRunnable);

    return X;
}


我真的可以使用其他建议。我只是不明白这里要发生什么。

最佳答案

您的表单可以很好地创建,并且只有一个引用,并且最终以该静态变量结尾。到那时为止一切都很好。

您需要注意Swing的一个“秘密”:您不能(明显地)从除Swing线程之外的其他任何线程(也就是事件调度线程)中更改GUI对象的属性。

无论如何,技巧是将属性更改代码作为Runnable传递给SwingUtilities.invokeAndWait()SwingUtilities.invokeLater()之一。



编辑:

好,让我们备份。您的表单是基于AWT的,而不是基于Swing的,因此,即使您正确实现了它,我担心使用SwingUtilities的建议也可能不会对您有所帮助。这次我将尝试给出更具体的提示。

您已经创建了AWT表单的类OBD2nerForm。该类具有一个构造函数,该构造函数调用initComponents在屏幕上设置一些GUI组件。

该类还具有一个称为setText的方法,该方法会将其自变量文本放入表单上的字段之一。该方法是一个实例方法,即您所说的不是“静态”方法。

您还有另一个类Status和一个类字段formform的初始化程序调用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本质上是程序的'boss'方法。

“第一个主对象”通常实例化并初始化一些对象。在非GUI应用程序中,main()然后可以启动循环或其他控制结构,然后在其中编排其他对象的动作。在GUI应用程序中,main()通常只实例化然后显示GUI,然后结束。一旦GUI可见,所有进一步的程序活动都由用户在GUI上执行的动作触发。

在没有看到您的代码的情况下,我猜测Obd2nerForm.main()也会实例化Obd2nerForm并显示它。因此,您可能确实确实有一个实例化但不可见的形式挂在Status.form上,而另一种实例化了,可见且从Obd2nerForm中的某个变量引用了。如果要影响该GUI,则需要引用可访问的表格。

可能最简单的是:

Obd2nerForm中,声明一个public static Obd2nerForm form,然后在Obd2nerForm.main中,在调用构造函数之后,立即将对窗体的引用复制到该变量中。从那时起,您可以使用来访问表单及其方法。 Obd2nerForm.form.setText()

提醒一下:您似乎有两个main(),这需要解决。在应用程序生命周期开始时应做的所有工作都必须放在这些main之一中,而不是几个。

最后,看一下这个方法调用:

Status.form.main(args);


这就是在特定实例上调用方法的语法。但是Obd2nerForm.main是一个类方法(您称之为“静态”),因此没有“特定的”可调用,它始终只是属于类本身的那个。这就是为什么调用类方法的语法类似于

Obd2nerForm.main(args);


编译器可以让您摆脱编写它的方式,但这不是通常的完成方式,并且表明有些混乱。

在那里...我希望可以使您更进一步。如果仍然有问题,请向PasteBin发布更完整的代码示例,我来看看!

关于java - 有人可以使用我的示例解释如何从静态setText吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3379906/

相关文章:

Python isDisjoint() 运行时

C++初始化一组结构

java - 如何在标签上设置整数值?

java - 使用 Java 或其他方式发送 GET 和 POST 请求而没有响应

java - 如何在java中访问R(光栅对象)

Javascript:将某些信息推送到数组并从数组中获取信息

php - 使用 javascript/ajax 通过 anchor 运行 php 文件?

c++ - 首次插入静态 STL 集会导致未处理的异常 0xC0000005 : Access violation to be thrown

java - 更改 Java 临时 Internet 文件存储位置

Java 驱动程序抛出错误