2013-05-13 114 views
0

我有三個類,其中我創建對象是JPanels即MyObject擴展JPanel。我在主要方法調用中調用所有三個面板。GUI之間的通信Java

MyObject1 mo1 = new MyObject1(); // contains a textfield and a button 
MyObject2 mo2 = new MyObject2(); // contains a textarea holding a long paragraph 
MyObject3 mo3 = new MyObject3(); 

如何讓mo1調用mo2上的方法來改變文本區域的文本?

感謝所有的建議傢伙!我要繼續並接受第一個答案。它解決了我的問題。

更新 其中一個面板是在我的程序的另一兩個面板,這是我的妨礙到一個物體的一個實例傳遞給某一類能力的組合。通過刪除該面板類,並在主要創建一個jpanel然後將兩個面板添加到新的jpanel我能夠將類的實例傳遞給每個構造函數。

所以反過來我的解決辦法是

JPanel panelHolder = new JPanel(); // create a panel in my main instead of a new class 
MyObject2 mo2 = new MyObject2(); // contains a textarea holding a long paragrah 
MyObject1 mo1 = new MyObject1(mo2); // contains a textfield and a button 
panelHolder.add(mo1); 
panelHolder.add(mo2); 
MyObject3 mo3 = new MyObject3(); 

,然後在MO 2類:

private MyObject1 object1; 

// constructor for mo2 Class 
public MyObject2(MyObject1 object1){ 

this.object1 = object1; // to get the instance of object1 
....// other constructor pieces 
} 

再次感謝你們!

+0

你是如何處理這些事件的?我假設當你按下按鈕時,mo1有一個事件處理程序。 – 2013-05-13 19:01:26

+0

是的,我爲該按鈕創建了一個ActionListener,將文本字段設置爲使用按鈕打開的文件的名稱。但我然後想給其他Jpanel整個文件內容。 – 2013-05-13 19:09:24

回答

2

爲什麼不通過MyObject1實例對構造函數MyObject2的引用?

MyObject1 mo1 = new MyObject1(); 
MyObject2 mo2 = new MyObject2(mo1); 

然後,(假設你的方法是公共或包私有的),你可以簡單地從mo2調用mo1.methodName()。正如我在評論中提到的那樣,您應該在mo1的構造函數中實例化您計劃編輯的任何組件,以避免在從mo2撥打電話時發生NullPointerExceptions。

+0

我試圖用我的其他面板的實例創建構造函數,但是當我嘗試更改文本時遇到空指針異常。 – 2013-05-13 19:02:32

+0

在由其他類編輯之前,您需要實例化在構造函數中編輯的任何組件。 – drewmoore 2013-05-13 19:03:56

1

MyObject1的參考文件傳遞給MyObject2怎麼樣?

public class MyObject2 extends JPanel 
{ 
    private MyObject1 obj; 

    public MyObject2(MyObject1 obj) 
    { 
     this.obj = obj; 
    } 
} 

,然後你的代碼會是這樣:

MyObject1 mo1 = new MyObject1(); 
MyObject2 mo2 = new MyObject2(mo1); 

  • ,如果你希望每個班有其他的參考是什麼?

  • 簡單。只需添加一個設置在MyObject1喜歡:

public class MyObject1 extends JPanel 
{ 
    private MyObject2 obj; 

    public MyObject1() 
    { 
     // ... 
    } 

    public void setMyObject2Reference(MyObject2 obj) 
    { 
     this.obj = obj; 
    } 
} 

然後:

MyObject1 mo1 = new MyObject1(); 
MyObject2 mo2 = new MyObject2(mo1); 
mo1.setMyObject2Reference(mo2); 
0
MyObject1 mo1 = new MyObject1(); // contains a textfield and a button 
MyObject2 mo2 = new MyObject2(); // contains a textarea holding a long paragrah 
MyObject3 mo3 = new MyObject3(); 

將其更改爲

MyObject2 mo2 = new MyObject2(); // contains a textarea holding a long paragrah 
MyObject1 mo1 = new MyObject1(m02); // contains a textfield and a button 
MyObject3 mo3 = new MyObject3(); 

然後就可以調用像MO1。 getM02()。UPDATETEXT( 「測試」);