编写ActionListener以通过按下按钮来绘制形状

时间:2016-09-12 17:48:20

标签: java

每次按下Draw Circle / Draw Line按钮时,我都需要编写一个绘制圆/线的GUI。

框架工作得很好,但是我在为这个程序实现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);
}

3 个答案:

答案 0 :(得分:2)

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

注意:在此设计中,将MyPanel内部类framcircZ成为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);
  }

答案 1 :(得分:0)

您需要做的是为每个JButton添加一个actionListener。将一个添加到bt1,将一个添加到btn2。在每一个中,你都会知道哪一个被按下了,因为那个的actionListener会被触发。在每个中,句柄生成一个圆或一行。我这样做的方法是创建一个CopyOnWriteArrayList来保存面板正在绘制的几何图形 - 否则你可能会遇到ConcurrentModification。此外,使用Optional或AtomicRefence来保存新生成的形状。在重绘中,您需要查看Optionals / AtomicReferences中的任何一个是否具有新值。如果是,请将其添加到数组列表中,然后将其从原子引用中删除。在它下面,循环遍历数组列表并绘制它包含的所有图形对象。

答案 2 :(得分: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);
}