2010-07-17 61 views
0

這讓我瘋狂。我有一個基於文本的工作應用程序。它有許多變量,現在需要一個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); 
    } 

} 

我所擁有的是我正在使用靜態和非靜態我猜..沒有什麼顯示在文本框中。我一直玩耍,並刪除所有的錯誤,但它不起作用。我真的不知道該怎麼做。看起來這是最好的配置,因爲沒有錯誤,但文本框沒有做任何事情。

我應該補充說,這是我的第一種形式!

+0

這可能值得看看log4j-swing-appender的靈感:http://code.google.com/p/log4j-swing-appender/作者可能會經歷很多設計問題正面臨着。 Subversion提交評論http://code.google.com/p/log4j-swing-appender/source/list對於鏈接意圖和代碼更改是很好的。 – 2010-07-17 02:39:58

回答

1

如果你給日誌的靜態引用的OBD2nerConsole一個實例,並刪除靜態更新(字符串)你應該能夠更新textField1的。改性Log.java

清單:

清單的 Updatable.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); 
     } 
    } 
} 

public interface Updatable { 
    void update(String); 
} 

上市的ODB2nerConsole.java改性片段的:

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

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

好的。如果我想從其他地方創建對象然後我的日誌?我必須創建一個新的實例嗎?或者我的日誌會在這之後變成我的同步器嗎? 基本上,我希望不是創建一個新的,我可以使用現有的信息來更新表單。 – 2010-07-17 02:41:46

+0

當然:)你可以添加一個名爲Updatable的接口,它有一個方法更新(String)並讓ODB2nerConsole實現它。然後像Updatables這樣的第三方可以提供[public static Updatable getUpdatable()],它返回一個ODB2nerConsole實例。我想現在這件事正在下降到希臘,所以我會冷靜下來。 – 2010-07-17 02:48:06

+0

哇。那是希臘語。我剛剛在VB中處理了太久,還是有辦法說:Console.TextField1.setText(「我的任意文本」); – 2010-07-17 12:23:19

2

假設textField1是父類的一個屬性,update方法不應static。這當然意味着您需要將該方法應用於對象的實例。

Java中的規則是,static方法不能通過顯式使用對類實例的引用來訪問其類的非靜態屬性和方法。

這使得那些在Java中面向對象編程新手的人嘗試使所有內容都變爲靜態。但是,正如你所看到的那樣,這會導致麻煩。正確的解決方案是將靜態的使用限制在真正需要的情況下。這些如下:

  • 共享常量;例如public static final String FOO = "foo";
  • 僅依賴其參數狀態的輔助方法。
  • 對全局數據結構的隱藏引用,使用「單例」模式公開(如有必要)。