如何从静态类更新文本框?

时间:2010-07-17 02:15:20

标签: java class static non-static

这让我疯了。我有一个基于文本的工作应用程序。它有许多变量,现在需要一个GUI。我从基础开始。每当某些数据发送到我的日志时,我希望它显示在我的文本框中。

这是数据传递的统一入口点,可以在其中进行操作。

public class Log {

    private static void consoleOut(String data) {
    System.out.println(data);
    OBD2nerConsole.update(data);
    }
      public static void level0(String data) {
    if (Status.ConsoleLevel >= 0) {
    consoleOut(data);

    }

这是我的表单,它有一个文本框和几个按钮。

public class OBD2nerConsole extends java.awt.Frame {

    public static void update(String data) {
        textField1.setText(textField1.getText() + data);
    }   

}

我所遇到的问题是,我正在使用静态和非静态的工具。我猜测。文本框中没有显示任何内容。我一直在玩,并删除所有的错误,但它不起作用。我真的不知道该怎么做。看来这是最好的配置,因为没有错误,但文本框没有做任何事情。

我应该补充一点,这是我的第一个表格!

2 个答案:

答案 0 :(得分:2)

假设textField1是父类的属性,update方法不应该是static。这当然意味着您需要将该方法应用于ODB2tunerConsole对象的实例。

Java中的规则是static方法无法通过显式使用对类实例的引用来访问其类的非静态属性和方法。

这使得那些刚接触Java的面向对象编程的人试图让一切都变得静态。但是如你所见,这会导致麻烦。正确的解决方案是将静态的使用限制在真正需要它们的情况下。具体如下:

  • 共享常数;例如public static final String FOO = "foo";
  • 仅依赖于其参数状态的辅助方法。
  • 隐藏对全局数据结构的引用,使用“单例”模式公开(如有必要)。

答案 1 :(得分:1)

如果您为 OBD2nerConsole 提供 Log 静态引用,并从 update(String)中删除 static 您应该能够更新 textField1

修改后的Log.java

列表
public class Log {
    private static Updatable console = Updatables.getUpdatable();

    private static void consoleOut(String data) {
        System.out.println(data);
        console.update(data);
    }

    public static void level0(String data) {
        if (Status.ConsoleLevel >= 0) {
            consoleOut(data);
        }
    }
}

Updatable.java的列表:

public interface Updatable {
    void update(String);
}

ODB2nerConsole.java修改后的代码段列表:

public class OBD2nerConsole extends java.awt.Frame implements Updatable {
    @Override
    public void update(String data) {
        textField1.setText(textField1.getText() + data);
    }
}

Updatables.java的列表:

public class Updatables {
    public Updatable getUpdatable() {
        return new ODB2nerConsole();
    }
}