2010-07-17 2 views
0

Это сводит меня с ума. У меня есть работающее текстовое приложение. Он имеет много переменных, которым теперь нужен графический интерфейс. Я начинаю с основ. Всякий раз, когда некоторые данные отправляются в мой журнал, я хочу, чтобы он отображался в моем текстовом поле.Как обновить текстовое поле из статического класса?

Здесь приведена единая точка входа для передачи данных, где ее можно манипулировать.

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

} 

prolem я имею, что я работаю с статическим и нестатическим я думаю .. Там нет ничего отображается в текстовом поле. Я продолжал играть и удалять все ошибки, но он не работает. Я действительно не знаю, что делать. Кажется, что это лучшая конфигурация, потому что ошибок нет, но текстовое поле ничего не делает.

Должен сказать, что это моя первая форма КОГДА-ЛИБО!

+0

Возможно, стоит посмотреть на log4j-swing-appender для вдохновения: http://code.google.com/p/log4j-swing-appender/. Авторы, вероятно, прошли множество проблем с дизайном, сталкиваются. Замечания о компиляции Subversion http://code.google.com/p/log4j-swing-appender/source/list были бы хороши для связывания намерений с изменением кода. –

ответ

1

Если вы даете Войти статическую ссылку на экземпляр OBD2nerConsole и удалить статический из обновления (String) вы должны быть в состоянии обновить 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(); 
    } 
} 
+0

ОК. как насчет того, хочу ли я создать этот объект из другого места, кроме моего журнала? Должен ли я создать новый экземпляр? или мой журнал станет моим синхронизатором после этого? В принципе, я надеялся вместо создания нового, я мог бы использовать существующую информацию для обновления формы. –

+0

Конечно :) Вы могли бы добавить интерфейс под названием Updatable, который имеет обновление метода (String), и реализовать его ODB2nerConsole. Тогда сторонние, такие как Updatables, могут предоставить [public static Updatable getUpdatable()], который возвращает экземпляр ODB2nerConsole. Я предполагаю, что это сейчас спускается в греческий, так что я буду холодно. –

+0

ничего себе. это греческий. Я просто занимался VB слишком долго, или есть способ сказать: Console.TextField1.setText («мой произвольный текст»); –

2

Предполагая, что textField1 является атрибутом родительского класса, метод update не должен быть static. Это, конечно, означает, что вам нужно применить метод к экземпляру объекта ODB2tunerConsole.

Правило в Java заключается в том, что метод static не может получить доступ к нестационарным атрибутам и методам своего класса с явным использованием ссылки на экземпляр класса.

Это приводит людей, которые новичок в объектно-ориентированном программировании на Java, чтобы сделать все статичным. Но, как вы видите, это приводит к неприятностям. Правильное решение - ограничить использование статики случаями, когда они действительно необходимы. Это следующие:

  • Общие константы; например public static final String FOO = "foo";
  • Вспомогательные методы, которые зависят только от состояния их аргументов.
  • Скрытые ссылки на глобальные структуры данных, выставленные (если необходимо) с использованием шаблона «singleton».
Смежные вопросы