2016-09-12 1 views
1

Circle/Draw Line 버튼을 누를 때마다 원/선을 그리는 GUI를 작성해야합니다.버튼을 눌러 모양을 그리는 ActionListener 작성하기

프레임이 제대로 작동하지만이 프로그램의 ActionListener 구현에 문제가 있습니다. 나는 "부울 circZ"와 버튼을 연결하는 방법을 모르겠다. 내가 시도한 모든 것은 나에게 오류를 준다.

아마도 도움을 줄 수 있습니다.

public class fram extends JFrame { 
    fram(){ 
     JPanel panel = new JPanel(); 
     add(panel); 
     JButton btn1 = new JButton("Draw Circle"); 
     JButton btn2 = new JButton("Draw Lines"); 
     panel.add(btn1); 
     panel.add(btn2); 
     MyPanel obj = new MyPanel(); 
     panel.add(obj); 
} 

public class MyPanel extends JPanel{ 
    public boolean circZ = true; 

    public void paintComponent(Graphics g){** 
     super.paintComponent(g); 
     if(cicZ == true){ 
      g.setColor(Color.BLACK); 
      g.drawOval(150, 50, 50, 50); 
     }else if(circZ==false){ 
       ... 
      } 
    } 
} 

public class CRListener implements ActionListener(){ 

      !!! I DO NEED HELP HERE !!! 
} 

public static void main(String[]args){ 
    fram f = new fram(); 
    f.paint(null); 
} 
+1

은'ActionListener'는'JFrame'에 추가 할 수 있습니다. 그래서'JFrame'을 확장하고'public class fram extends JFrame extends ActionListener'로 선언하기 때문에'fram' 클래스에서 이벤트 처리를 할 것입니다. 그게 도움이 되니? – progyammer

+1

또한, 'fram' 클래스 생성자에'addActionListener (this);'문이 필요합니다. – progyammer

답변

2

버튼에 익명의 ActionListeners를 추가하여 수행하려는 작업을 수행 할 수 있습니다 (아래 참조). 나중에 참조 할 수 있도록 MyPanel final 또는 포함 된 멤버 fram을 만들어야합니다.

참고 :이 디자인, 그것은 MyPanelframcircZ 당신은 방법을 구현해야 fram

MyPanel obj; 
    fram(){ 
     JPanel panel = new JPanel(); 
     add(panel); 
     JButton btn1 = new JButton("Draw Circle"); 
     JButton btn2 = new JButton("Draw Lines"); 
     btn1.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent ae) { 
      obj.circZ =...; 
     } 
     }); 
     btn2.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent ae) { 
      obj.circZ =...; 
     } 
     }); 
     panel.add(btn1); 
     panel.add(btn2); 
     obj = new MyPanel(); 
     panel.add(obj); 
    } 
0

각 JButton에 actionListener를 추가해야합니다. bt1에 하나를 추가하고 btn2에 하나를 추가하십시오. 각각 하나씩, 당신이 눌렀다는 것을 알게 될 것입니다. 왜냐하면 그 것에 대한 actionListener가 작동하기 때문입니다. 각각에서 원이나 선을 생성하는 핸들. 내가하는 일은 패널이 그린 도형을 유지하기위한 CopyOnWriteArrayList를 만드는 것입니다. 그렇지 않으면 ConcurrentModification을 실행할 수 있습니다. 또한 새로 생성 된 모양을 유지하려면 Optional 또는 AtomicRefence를 사용하십시오. 다시 페인트 할 때, 당신은 Optionals/AtomicReferences 중 하나가 새로운 값을 가지고 있는지 알아야 할 것입니다. 그렇다면 배열 목록에 추가 한 다음 원자 참조에서 제거하십시오. 그 아래에서 배열 목록을 반복하고 포함 된 모든 그래픽 객체를 그립니다.

+0

다운 된 투표 코드와 마찬가지로 ActionListeners에서 MyPanel을 참조 할 방법이 없습니다 – ControlAltDel

+0

나는 숟가락으로 먹인 답을주지 않았습니다. 어떻게 처리해야하는지에 대한 기초를 제공했습니다. – Jacob

+0

야곱 당신은 "숟가락 먹이기"를 원하지 않더라도 범위 지정 문제가 있음을 적어도 언급 했어야합니다. – ControlAltDel

0

의 부재의 내부 클래스 만들기 위해 청소기 될 것이다 :

class CRListener implements ActionListener { 

     public void actionPerformed(ActionEvent e) {  
      System.out.println("Hello action listener"); // nothing happens  
     } 
} 

및 단추에 연결하십시오.

btn1.addActionListener(new CRListener()); 

모든 버튼의 반복 (그리고 그것이 작동되도록) 다음 생성자에 매개 변수를 전달하여 최적화 볼 수 - 당신이 :)

업데이트] 의견

을 기반으로 그 부분을 알아낼 드리겠습니다 패널에 위의 액션 청취자를 연결하려면

, 당신은 다음 작업을 수행 할 수 있습니다 :

public class fram extends JFrame { 

    MyPanel myPanel; 

    fram(){ 
     JPanel panel = new JPanel(); 
     add(panel); 
     JButton btn1 = new JButton("Draw Circle"); 
     JButton btn2 = new JButton("Draw Lines"); 

     // add event listeners 
     btn1.addActionListener(new CRListener()); 
     btn2.addActionListener(new CRListener()); 

     panel.add(btn1); 
     panel.add(btn2); 
     myPanel = new MyPanel(); 
     panel.add(myPanel); 
} 
+0

다운 된 투표 코드와 마찬가지로 ActionListeners에서 MyPanel을 참조 할 방법이 없습니다. – ControlAltDel

관련 문제