2012-03-21 5 views
2

하나의 TestArea가있는 프레임이 하나 있습니다. 이 클래스의 문자열을 추가하면 String이 추가되지만 다른 클래스의 String을 추가하려면 String이 추가되지 않습니다. TextArea에 문자열을 추가하는 한 가지 방법을 만들었습니다.이 클래스에서이 메서드를 호출하면 문자열이 텍스트 영역에 추가됩니다. 하지만 다른 클래스에서이 메서드를 호출하면 String이 TextArea에 추가되지 않습니다.Java : 다른 클래스의 TextArea에 인쇄 할 수 없습니다.

코드 (MainClass) :

public class MainClass { 
private JFrame frame; 
private TextArea textArea; 
private Font font; 
private JButton button1; 
private JButton button2; 
private SecondClass secondClass; 

public MainClass() { 
    try { 
     UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
     frame = new JFrame("XXX"); 
     frame.setBounds(200, 200, 600, 400); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.getContentPane().setLayout(null); 

     button1 = new JButton("Button1"); 
     font = new Font("Arial", Font.BOLD, 13); 
     button1.setFont(font); 
     button1.setBounds(4, 4, 289, 30); 

     button2 = new JButton("Button2"); 
     button2.setFont(font); 
     button2.setBounds(300, 4, 289, 30); 

     font = null; 

     textArea = new TextArea(); 
     textArea.setBounds(4, 38, 585, 322); 
     textArea.setEnabled(true); 

     font = new Font("Arial", Font.PLAIN, 13); 
     textArea.setFont(font); 

     frame.add(button1); 
     frame.add(button2); 
     frame.add(textArea); 

     button1.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       textArea.append("*** I am in actionPerformed() ***\n"); 
       appendToTextArea("Call from actionPerformed() method\n"); 
      } 
     }); 

     button2.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       secondClass = new SecondClass(); 
       secondClass.printOnTextArea(); 
      } 
     }); 

    } catch (Exception e) { 
     textArea.append(e.toString()); 
    } 
} 

public void appendToTextArea(String str) { 
    System.out.println(str+"\n"); 

    textArea.append(str+"\n"); //this line not work when I call this method from other class 
} 

public static void main(String[] args) { 
    EventQueue.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      MainClass window = new MainClass(); 
      window.frame.setVisible(true); 
     } 
    }); 
} 

} 

코드 (SecondClass) :이 작동하지 않는 이유

import com.grissserver.MainClass; 

public class SecondClass extends MainClass{ 
void printOnTextArea() { 
    System.out.println("*** printOnTextArea() ***"); 
    super.appendToTextArea("call from Second Class in printOnTextArea()"); 
} 
} 

이 어떤 아이디어를주십시오.

+0

1) 빨리,이 [SSCCE] (http://sscce.org/)을 게시 할 수 있습니다. 2) Swing (예 :'JFrame' /'JButton')과 AWT (예 :'Canvas') 구성 요소를 섞지 마십시오. 3) * "아이디어를주십시오."* Q & A 사이트이므로 ***에 질문 할 것입니다. *** 4)'null '레이아웃을 사용하지 말고'setBounds()'- 그것은 네이티브 PLAF를 사용할 때 실제 세계에서 * 특히 * 채워질 것입니다! –

답변

3

SecondClass은 자체 textArea를 가지고 있습니다. 따라서 MainClass의 textArea를 SecondClass으로 전달해야 할 수 있습니다.

public class SecondClass { 
    private TextArea tArea; 
    SecondClass(TextArea ta) { 
     tArea = ta; 
    } 
    void printOnTextArea() { 
     System.out.println("*** printOnTextArea() ***"); 
     tArea.append("call from Second Class in printOnTextArea()"); 
    } 
} 

이처럼 MainClass을 변경해야합니다. 더 나은에 대한 도움말이 도움이

.... 
button2.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent arg0) { 
     secondClass = new SecondClass(textArea); 
     secondClass.printOnTextArea(); 
    } 
}); 
.... 

희망 ...

+0

고맙습니다 shan을보십시오 ...... –

+0

당신이이 질문을 좋아한다면 다른 사람들도 이익을 얻도록 투표하십시오. –

4

제가 생각하기에는 텍스트 영역에 페인트하는 방식이 잘못되었다고 생각합니다.

SecondClass의 새 개체를 만들면 MainClass이됩니다. 즉,이 객체는 고유 한 텍스트 영역 객체를가집니다. 그러나 MainClass#mainsetVisibile만을 호출하기 때문에이 새로운 개체 (프레임)가 표시되지 않으므로 표시된 텍스트를 볼 수 없습니다!

요약하면 두 가지 텍스트 영역이 있습니다. 그 중 하나는 보이지 않습니다.

+0

Ok ... 문제를 이해합니다 ... 어떻게 해결할 수 있습니까? –

+0

텍스트 영역에 대한 참조를'SecondClass'에 전달해야합니다. shan의 대답 – hage

관련 문제