2014-01-30 2 views
1

JPanel을 확장하는 클래스 "GUI"가 있습니다. JFrame을 확장하는 또 다른 클래스 "Buttons"가 있습니다. JButton "clearB"JFrame에 푸시 될 때 JPanel 클래스에서 메서드를 "clearScreen()"JFrame 클래스를 호출 할 수 있도록 노력하고있어. 나는이 작품을 만들 수 있는 유일한 방법은 바로 JButton의의의 ActionListener의 JPanel의 클래스 "GUI"에 대한 객체를 구축했다 :Jpanel, repaint() 메서드를 사용하여 클래스 간 의사 교환

clearB.addActionListener(
       new ActionListener(){ 
        public void actionPerformed(ActionEvent event){ 
         GUI g = new GUI(); 
         g.clearScreen(); 

        } 
       } 
      ); 

그러나 나는처럼 보이는 방법 clearScreen()를 호출시 이 :

public void clearScreen(){ 
     xs.clear(); 
     ys.clear(); 
     count = 0; 
     repaint(); 
    } 

아무 것도 없습니다. Repaint() 메서드가 나에게 알려지지 않은 어떤 이유로 작동하지 않았기 때문에 그럴 것 같아요. 누군가 여기서 내가 성취하려는 일을보다 쉽고 잘 수행 할 수있는 방법을 보여주십시오. 감사합니다. : D

답변

2

ActionListener가 작동하지 않는 이유는 거기에 생성 한 GUI 객체가 새로운 GUI 객체이고, 표시되는 GUI 객체와 완전히 관련이 없기 때문입니다. 표시되지 않은 GUI 인스턴스의 clearScreen() 메소드는 표시된 GUI 인스턴스에 영향을 미치지 않습니다.

해결 방법은 Buttons 클래스가 유효한 참조을 시각화 된 GUI 개체에 적용하고이 참조에서 메서드를 호출하는 것입니다. 참조는 setter 메서드 또는 생성자 매개 변수를 통해 전달 될 수 있습니다.

즉,

public class Buttons { 
    private GUI gui; 

    public Buttons (GUI gui) { 
    this.gui = gui; 
    } 

    // in some ActionListener code... 
    gui.someMethod(); 
} 

코멘트 몇 :

  • 당신이 JFrame의를 확장하는 클래스를 가져야한다는 것을 이례적인 일이다. 나 자신이 필요로하지 않는 한이 일을 피하려고 노력하지만 JFrame 클래스 자체에서 그리고 필요할 때만 내 JFrames를 만듭니다.
  • GUI 인스턴스를 표시 할 가능성이 있으므로 기본 창 클래스에 아직 GUI 변수가 없다는 것에 조금 놀랐습니다.
+0

메모리 레인 내려 가기 - 와우 나는 2 년 전 그런 멍청한 놈 이었어. – johmsp