2014-12-07 139 views
2

主類:如何從另一個類訪問textarea?

public class tuna { 
    public static void main(String[] args) { 
     JFrame frame1 = new JFrame();   
     frame1.setVisible(true); 
     frame1.add(new apple()); 
     frame1.setSize(200 , 240);  
    } 
} 

二等

public class apple extends JPanel{ 
    JTextArea ta = new JTextArea(); 
    Border blackline = BorderFactory.createLineBorder(Color.black); 
    apple(){ 
     setBorder(blackline); 
     System.out.println("apple"); 
     ta.setText("hello"); 
     ta.setEditable(false); 
     add(ta); 
     add(new doctor()); 
     repaint(); 
     revalidate();  
    } 
} 

第三類

public class doctor extends JPanel implements ActionListener{ 
    public JButton butt = new JButton("change"); 
    Border blackline = BorderFactory.createLineBorder(Color.black); 
    public doctor(){ 
     setBorder(blackline); 
     add(butt); 
    } 
    @Override 
    public void actionPerformed(ActionEvent e){  
     if(e.getSource() == butt) 
     { 
      System.out.println("she"); 
     } 

    } 
} 

爲什麼每次按下按鈕,它不會打印出 「她」 在控制檯中。 我需要我的程序在每次按下按鈕時更改文本區域內的文本。 例如,當我按下按鈕,它應該在文本區域添加「世界」,請幫助我!

回答

4

想一想,誰是負責更新JTextAreaappledoctor

如果你回答了apple那麼你是對的,apple應該保持對組件的控制並控制對組件的訪問。

作爲擴展,doctor沒有理由知道或關心apple或它可以做什麼,它只需要能夠通知感興趣的一方某些情況已經發生變化,它不應該在乎其他類如何處理信息,因爲它超出了其一般責任的範圍。

這是Observer Pattern的典型示例,其中一個(或多個)感興趣方觀察對另一個的更改並對其採取措施。

現在,問題是,如何最好地實現這一目標?有很多解決方案,您可以推出自己的監聽器interface,您可以使用預先存在的監聽器,如ChangeListener,或者您可以使用組件提供的內置功能。你的選擇將取決於您的需求,以保持它的簡單,我使用的是最後一個......

當您創建的doctor一個實例,你可以添加一個PropertyChangeListener它...

doctor doc = new doctor(); 
doc.addPropertyChangeListener("change", new PropertyChangeListener() { 
    @Override 
    public void propertyChange(PropertyChangeEvent evt) { 
     Object newValue = evt.getNewValue(); 
     if (newValue instanceof String) { 
      ta.setText(newValue.toString()); 
     } else if (newValue == null) { 
      ta.setText(null); 
     } 
    } 
}); 
add(doc); 

在你buttActionListener,你會觸發一個PropertyChangeEvent ...

@Override 
public void actionPerformed(ActionEvent e){  
    if(e.getSource() == butt) 
    { 
     // If you want to, you could pass the "old" value 
     firePropertyChange("change", null, "she"); 
    } 
} 

作爲一個可能的例子...

+0

是的,這是更好的方法。很好的回答,+1 – cybersoft 2014-12-07 11:16:39

+0

這個問題解決了!但如果我想追加一個文本而不是改變整個文本呢? – PNC 2014-12-07 11:25:36

+0

@PNC'JTextArea#append' ... – MadProgrammer 2014-12-07 11:26:23

2

您必須爲按鈕指定監聽器:當創建

public JTextText ta; 

通行證apple實例doctor例如:

butt.addActionListener(this) 

要做到在文本區域的變化,你必須做實地ta公共

new doctor(this) 

然後保存參考erence到該實例中doctor

private apple instance; 

actionPerformed方法,你可以做的操作與文本區域:

instance.ta.setText("Some text."); 

也可以添加方法你apple類設置文本到文本區域:

public void setTextAreaText(String text) { 
    ta.setText(text); 
} 

並在actionPerformed

instance.setTextAreaText("Some text."); 

注:想想類& varialbe命名:old doc

+0

感謝它解決了一個小問題,它應該是butt.addActionListener(this) – PNC 2014-12-07 10:15:36

+0

*「要在文本區域進行更改,您必須執行field ta public:」*這是不正確的,實際上可能是第二個最糟糕的事情可以做('靜態'是最糟糕的)。儘可能避免將UI元素暴露給外部修改。現在,這允許代碼對'JTextArea'執行各種令人討厭的事情,比如將其從其父容器中移除或移動到新的容器。組件管理的責任是容器類,想要改變的其他類應該通過setter來實現... – MadProgrammer 2014-12-07 10:51:42

+0

我寫了setter,就像你說的那樣?無論如何,恕我直言,我認爲作者代碼中沒有任何意義可以觀察到。 – cybersoft 2014-12-07 11:00:43