代码之家  ›  专栏  ›  技术社区  ›  Adam Outler

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

  •  0
  • Adam Outler  · 技术社区  · 15 年前

    这让我发疯。我有一个基于文本的应用程序。它有许多变量,现在需要一个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 回复  |  直到 9 年前
        1
  •  1
  •   Alain O'Dea    9 年前

    如果你给 原木 对的实例的静态引用 OBD2控制台 去除 静止的 更新(字符串) 您应该能够更新 文本字段1 .

    修改的列表 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();
        }
    }
    
        2
  •  2
  •   Stephen C    15 年前

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

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

    这使得Java中面向对象编程的人尝试使所有的事物都是静态的。但正如你所见,这会带来麻烦。正确的解决方案是将静态的使用限制在实际需要的情况下。如下:

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