2014-12-07 3 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);  
    } 
} 

2 등석

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();  
    } 
} 

3 종

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"); 
     } 

    } 
} 

왜 매번 버튼은 늘 콘솔에서 "그녀를"인쇄를 누르면됩니다. 버튼을 누를 때마다 텍스트 영역 내부의 텍스트를 변경하려면 프로그램이 필요합니다. 예를 들어 버튼을 눌렀을 때 텍스트 영역에 "world"가 추가되어야합니다.

답변

4

이것에 대해 생각의 JTextArea, apple 또는 doctor를 업데이트 할 책임이있다 : 클래스 & varialbe 명명 생각해?

apple로 대답하면 apple은 구성 요소를 제어하고 액세스를 제어해야합니다.

doctorapple에 대해 알고 있거나 신경 쓸 이유가 없으며 이해 관계자에게 일정 조건이 변경되었다는 알림을 제공하기 만하면됩니다. 정보는 일반적인 책임 범위를 벗어납니다.

이 예는 Observer Pattern의 고전적인 예입니다. 하나 이상의 (또는 그 이상의) 이해 관계자가 다른 사람의 변경 사항을 관찰하고 이에 대한 조치를 취합니다.

지금, 문제는 이것이 최상의 달성 방법입니다.당신은 자신의 청취자 interface을 롤 수 있으며, ChangeListener과 같은 기존 청취자를 사용하거나 구성 요소가 제공하는 inbuilt 기능을 사용할 수있는 여러 가지 솔루션이 있습니다. 당신이, 내가 마지막 하나를 사용하고 간단하게하기 위해, 사용자의 요구 사항에 따라 달라집니다 선택 어떤 ... 당신이 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); 
당신의 butt ActionListener에서

, 당신은 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

+0

이것은 문제를 해결! 하지만 전체 텍스트를 변경하는 대신 텍스트를 추가하고 싶다면 어떨까요? – PNC

+0

@PNC'JTextArea # append' ... – MadProgrammer

2

당신은 버튼에 대한 리스너를 지정해야합니다

butt.addActionListener(this) 

이 텍스트 영역의 변경을하려면, 당신은 ta 공공 필드를 수행해야합니다

public JTextText ta; 

패스 apple 예 예 doctor에를 만들 때 :

new doctor(this) 

그런 다음 ref

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

또는 당신은 텍스트 영역에 텍스트를 설정하려면 apple 클래스에 메소드를 추가 할 수 있습니다 : 당신이 텍스트 영역으로 조작을 할 수

private apple instance; 

방법 actionPerformed에서 : doctor에 해당 인스턴스에 ERENCE

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

그리고 actionPerformed에서 :

,
instance.setTextAreaText("Some text."); 

참고 : old doc

+0

발생하게됩니다 덕분에 사소한 문제가 해결되었고 butt.addActionListener (this) – PNC

+0

* "텍스트 영역을 변경하려면 ta public을 사용해야합니다."* 사실이 아니며 실제로는 두 번째 최악의 경우입니다. ('정적'이 최악의 경우) 할 수 있습니다. 가능한 한 UI 요소를 외부 수정에 노출시키지 마십시오. 이것은 이제 코드가 부모 컨테이너에서 제거하거나 새로운 컨테이너로 이동하는 것과 같이 모든 종류의 불쾌한 일을'JTextArea'에 할 수있게합니다. 구성 요소의 관리에 대한 책임은 컨테이너 클래스입니다. 변경하려는 다른 클래스는 setter를 통해 그렇게해야합니다. – MadProgrammer

+0

내가 말한대로 세터를 썼습니까? 그리고 어쨌든, IMHO, 필자는 코드를 관찰하기 위해 저자의 코드에서 어떤 의미도 보지 못했다. – cybersoft

관련 문제