2010-07-07 79 views
1

我正在編程桌面應用程序Java使用NetBeansJava Swing:如何從第一幀訪問第二幀中的變量?

我的問題是這樣的:

1:我有一個JFrame它是應用程序的主要框架。我想創建某種新的對象,所以我按下addButton y創建一個新的JFrame(我創建了一個擴展Jframe的新類窗口),其中包含一些文本字段。

private void addButtonMouseClicked(java.awt.event.MouseEvent evt) { 
    w = new window(); 
    w.setVisible(true); 
} 

這是一個簡單的字符串,而不是一個完整的類 http://img820.imageshack.us/img820/3361/screenshotlw.png

第三簡化截圖:在這個新窗口中有我讀的文本字段,並創建對象時,我按下按鈕一些。

最後,當我按下「接受」按鈕時,我希望新框架在第二幀中獲取對象。

問題:從第一個幀到第二幀獲取對象的最優雅/高效/簡單/更好的方法是什麼?

我的第一個解決方案:是在第一個窗口上創建靜態方法setNewData(),第二個窗口在您按下按鈕時調用此方法。

現在我來了一個新解決方案: 在第二幀我有一個方法來設置按鈕上的mouselistener。和一個getString()函數。

在第一幀我得到這個:

private void addButtonMouseClicked(java.awt.event.MouseEvent evt) { 
    w = new window(); 
    w.setHandler(ml); 
    w.setVisible(true); 
} 

MouseListener ml = new MouseAdapter() { 
    @Override 
    public void mouseClicked(MouseEvent e) { 
     TextFieldOn1stFrame.setText(w.getString()); 
    } 
}; 

和第二幀我得到這個

public void setHandler(MouseListener ml){ 
    button1.addMouseListener(ml); 
} 

public String getString(){ 
    return texto.getText(); 
} 

注意事項:很抱歉的長文本,我對Java和唐新不知道這個解決方案是否最好。 btw對不起我的英語。

回答

2

那麼,我沒有足夠的代表來評論mangst的解決方案,但是想要使用優雅和高效的話來說,這似乎是一些設計模式的主要機會。

這個mangst描述的是Observer模式的實現(http://en.wikipedia.org/wiki/Observer_design_pattern)。但是,我會建議使用mangst建議的實現接口的對象集合。這樣,根據給定的更新,您可以遍歷許多觀察者在每個觀察者中執行一些操作,無論是更改數據,演示等。如果多個窗口需要從您的子窗口接收數據/操作,那麼很容易只需在已有的觀察員列表中添加另一個。

也有調解員模式(http://en.wikipedia.org/wiki/Mediator_pattern)可以實現類似的結果。

對於非常常見的計算問題,有許多cookie切割方法,並且通過熟悉詞典,您可以輕鬆實施久經考驗的方法。

+0

我在想這樣的事情! 感謝您參考設計模式!我應該首先考慮一下(就是我期待的一些「直接java」解決方案,我想這不是那麼容易) 它的方式比我的第一個解決方案更優雅! 非常感謝! – 2010-07-10 20:32:06

+0

不客氣! – apiri 2010-07-10 20:40:30

1

最好的方法可能是使用它的構造函數或適當的setter方法將該對象傳遞給另一個類。

public void setWindow(Window w) { 
    this.w = w; 
    // now you can use "w" variable in whole class 
} 
2

我不知道這是做事情的Swing的標準方法,但需要在子窗口執行一些動作是創建自己的監聽器接口通知我做什麼,當父窗口爲那個孩子窗口。然後,我創建一個類,在我的父窗口中實現接口,並將該類的一個實例傳遞給子窗口。然後,孩子在執行特定動作時調用接口方法。所以在你的情況下,我會做以下事情:

(注意:最好使用ActionListener而不是MouseListener來處理按鈕點擊。)

Frame2Listener接口

public interface Frame2Listener{ 
    void theButtonWasClicked(String textBoxValue); 
} 

幀1(父)

private void addButtonMouseClicked(java.awt.event.MouseEvent evt) { 
    w = new window(new Frame2Listener(){ 
    public void theButtonWasClicked(String textBoxValue){ 
     TextFieldOn1stFrame.setText(textBoxValue); 
    } 
    }); 
    w.setVisible(true); 
} 

式2(子)

public window(final Frame2Listener fl){ 
    button1.addActionListener(new ActionListener(){ 
    public void actionPerformed(ActionEvent e){ 
     fl.theButtonWasClicked(texto.getText()); 
    } 
    }); 
} 
public void setHandler(MouseListener ml){ 
    //delete this method 
} 
public String getString(){ 
    //delete this method 
} 

我很樂意從任何搖擺專家聽到這是否是一個好的技術與否。

希望你喜歡Java! ;)

+0

謝謝!它似乎像一個實用的解決方案... – 2010-07-10 20:26:52

相關問題