2016-09-12 57 views
1

我需要编写一个GUI,每次按下Draw Circle/Draw Line按钮时都会绘制圆/线。编写ActionListener通过按下按钮来绘制形状

该框架工作得很好,但我无法实现此程序的ActionListener。我不知道如何用“boolean 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'。所以我会在'fram'类中做事件处理,因为它扩展了'JFrame'并声明为:'public class fram extends JFrame implements ActionListener'。这有帮助吗? – progyammer

+1

另外,在'fram'类构造函数中需要'addActionListener(this)'语句。 – progyammer

回答

2

通过将匿名ActionListeners添加到按钮中,您可以完成要执行的操作(请参见下文)。您需要创建您的MyPanel final或包含fram中的成员,以便稍后可以引用它。

注:在本设计中,这将是更清洁,使MyPanel一个内部类的framcircZfram

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