2012-11-28 134 views
1

我有兩個clases GUI(這renderes我的主要的JFrame)和打印類(即由JButton的調用上GUI類)。現在,在我的GUI類,我有JTextArea中和的方法:靜態方法來分配非靜態變量

void setOutput(String data) 
{ 
    // output is JTextArea 
    output.setText(data); 
} 

但是數據提供了打印的JFrame在那裏我有一個JButton用行動聽衆:

sizOpt.addActionListener(new ActionListener() 
{  
    @Override 
    public void actionPerformed(ActionEvent event) 
    { 
     // textfield is a JTextField component 
     String data = textfield.getText(); 


     // My problem is here i need to invoke the setOutput 
     // method in GUI to output the string however i cant call that method in 
     // any way but making it static or calling new GUI which will create a new 
     // Instance of GUI class 
     GUI.setOutput(data); 
    } 
}); 
+2

那麼......這個問題是怎麼回事?很好很抱歉看到它,但是真的不應該把你的實際問題放在代碼示例中的註釋中。 –

+0

對不起,這是上午5點,我的眼睛正在放血,我的思想即將臨近突破點。 –

回答

2

答案是:不在這裏使用靜態任何東西。

應該是靜態的唯一事情是你的主要方法,而這可能是它。如果您需要調用的GUI的方法,然後調用它的上實例的可視化圖形用戶界面的,而不是一個靜態方法。通常棘手的部分是獲取有效的引用,並且你是正確的,你不應該創建一個新的GUI對象,但也不要試圖做一個非工作的靜態解決方案。一些獲取有效引用的方法是通過構造函數參數或setter方法。

public class PrintJFrame extends JFrame { 
    private GUI gui; 

    public PrintJFrame(GUI gui) { 
    this.gui = gui; 
    } 

    // ... 
} 

現在在你的ActionListener,你可以調用由GUI變量保持的正確GUI參考的方法。接下來我們將討論爲什麼您應該避免讓類擴展JFrame和類似的GUI組件。 接下來我們'

+0

我的主要方法是在一個單獨的類中,我稱之爲類屬性GUI g;並在主要我有g =新的GUI();那麼我有一個名爲g.setOutput(data)的靜態方法引用(String data);我在我的打印類中調用main class.reference。然而,我更喜歡你的方法,所以我會重寫它沒有太多的工作,最終會更好地工作。 –

+0

@kellax:很高興幫助! –

1

對JFrame子類的實例進行靜態引用,並在JFrame上使用適當的實例方法來檢索文本。

+0

只要在其他類的非靜態實例上調用適當的方法,他會更好嗎? –

+0

我試圖對代碼提出最小限度的更改,但重新考慮僅僅對JFrame進行靜態引用就不那麼費力。已通過回答修改。 –