【问题标题】:how to update a textbox from a static class?如何从静态类更新文本框?
【发布时间】:2010-07-17 02:15:19
【问题描述】:

这让我发疯了。我有一个基于文本的工作应用程序。它有许多现在需要 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);
    }   

}

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

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

【问题讨论】:

标签: java class static non-static


【解决方案1】:

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

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

这导致不熟悉 Java 面向对象编程的人尝试将所有内容都设为静态。但正如你所见,这会带来麻烦。正确的解决方案是将静力学的使用限制在真正需要的情况下。它们如下:

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

【讨论】:

    【解决方案2】:

    如果您给 Log 一个对 OBD2nerConsole 实例的静态引用并从 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的修改sn-p列表:

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

    【讨论】:

    • 好的。如果我想从我的日志以外的其他地方创建该对象呢?我必须创建它的新实例吗?或者在此之后我的日志会成为我的同步器吗?基本上,我希望可以使用现有信息来更新表单,而不是创建新表单。
    • 当然 :) 您可以添加一个名为 Updatable 的接口,该接口具有方法 update(String) 并让 ODB2nerConsole 实现它。然后像 Updatables 这样的第三方可以提供返回 ODB2nerConsole 实例的 [public static Updatable getUpdatable()]。我想这现在正在下降为希腊语,所以我会冷静下来。
    • 哇。那是希腊语。是我刚在VB打交道太久,还是有办法说:Console.TextField1.setText("my任意文本");
    • 我设置了 public static OBD2nerConsole console = new OBD2nerConsole();在 public class Status 中,这是我所有全局变量的保存位置。有没有办法我现在可以从我的静态类中以某种方式操纵它?它似乎不想被操纵。一切都按原样进行,但是当我将数据从静态类发送到表单时没有任何反应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多