2008-11-26 83 views
2

我有一個JFrame,其中包含一個「顯示」JPanelJTextField和一個「控制」JPanel與按鈕應訪問顯示JPanel的內容。我認爲我的問題與如何使用觀察員模式有關,原則上我明白。您需要放置偵聽器和更新消息,但我不知道放置這些位置的方法,如何從一個面板訪問另一個面板,也可能需要引入「數據模型」類。例如,我想從控制面板訪問JTextField的內容,我使用匿名動作監聽器如下:如何訪問JFrame中的多個JPanel?

JButton openfile = new JButton("Convert file"); 
openfile.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent e) { 
     openButtonPressed(); 
    }   
}); 

回答

1

您需要降低這些對象之間的耦合。

你可以有一個主對象,擁有所有的文本框和按鈕(面板無關)

然後就是主對象內的separete的ActionListener(我把它稱爲調停見調解模式)

該動作偵聽器在中介器上執行一個方法,該方法又從文本字段獲取值並創建一個傳輸對象。

這樣,您減少面板,文本框等之間的耦合,並讓在一個地方(調解員),這是控制,你不要讓他們互相認識。

你可以在這個問題上的代碼來看看: https://stackoverflow.com/questions/324554/#324559

它顯示運行這些代碼的概念。

順便提一下,觀察者模式已經在JTextField,JButton,ActionListener等中實現了。您只需添加鉤子。

我希望這會有所幫助。

編輯將兩個答案合併爲一個。

這是代碼。

class App { // this is the mediator 

    // GUI components. 
    private JFrame frame; 
    private JTextField name; 
    private JTextField count; 
    private JTextField date; 
    // Result is displayed here. 
    private JTextArea textArea; 

    // Fired by this button. 
    private JButton go; 

    private ActionListener actionListener; 


    public App(){ 
     actionListener = new ActionListener(){ 
      public void actionPerformed(ActionEvent e){ 
       okButtonPressed(); 
      } 
     }; 
    } 

    private void okButtonPressed(){ 
     // template is an object irrelevant to this code. 
     template.setData(getData()); 
     textArea.setText(template.getTransformedData()); 
    } 


    public void initialize(){ 

     frame  = new JFrame("Code challenge v0.1"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     name  = new JTextField(); 
     count = new JTextField(); 
     date  = new JTextField(); 
     textArea = new JTextArea(); 
     go  = new JButton("Go"); 
     go.addActionListener(actionListener); // prepare the button. 

     layoutComponents(); // a lot of panels are created here. Irrelevant. 
    } 
} 

完成並運行的代碼可以檢索here:

它可能的情況下有利於組成了繼承是很重要的。

1

它確實使代碼更清潔,如果你在一個層創建模型,並添加上面的一兩層來創建組件和佈局。當然不會延伸JFrameJPanel之類的東西。

不要覺得有必要讓在模型層組成的層次結構完全匹配的顯示。然後,只需要從Document中獲取文本並執行相關操作即可。

好吧,perhpas沒有那麼簡單。 Swing模型有點混亂。特別是ButtonModel受到了腦損傷,並且代碼的控制器區域可能不完全是純粹的。

0

我們所謂的建設者,這將構建父面板出孩子。在此構建器中,您將可以訪問需要收聽的所有子組件,因此可以在其中實現任何邏輯。

最後生成器將隨後與完整的邏輯返回父面板。

一旦你得到了父面板這真是一個爛攤子讓孩子部件並將它們做任何事情。

0

謝謝。我添加了一個datamodel圖層來處理面板之間的通信。

我也發現了JTextField有用的聽衆此鏈接:

link text