Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/324.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 通过按按钮编写ActionListener以绘制形状_Java - Fatal编程技术网

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

Java 通过按按钮编写ActionListener以绘制形状,java,Java,我需要编写一个GUI,每当我按下按钮Draw Circle/Draw Line时,它都会绘制圆/线 框架工作得很好,但是我无法实现这个程序的ActionListener。我不知道如何用“布尔圈”连接按钮。我试过的每件事都会给我带来错误 也许你能帮忙 public class fram extends JFrame { fram(){ JPanel panel = new JPanel(); add(panel); JButton btn1 = new J

我需要编写一个GUI,每当我按下按钮Draw Circle/Draw Line时,它都会绘制圆/线

框架工作得很好,但是我无法实现这个程序的ActionListener。我不知道如何用“布尔圈”连接按钮。我试过的每件事都会给我带来错误

也许你能帮忙

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);
}

您需要做的是向每个JButton添加一个actionListener。将一个添加到bt1,一个添加到btn2。在每一个对话框中,您都会知道按下了哪一个,因为该对话框的actionListener将启动。在每个控件中,句柄生成一个圆或一条线。我的方法是创建一个CopyOnWriteArrayList来保存面板正在绘制的几何图形,否则您可能会遇到ConcurrentModification。另外,使用可选或原子引用来保存新生成的形状。在重新绘制中,您需要查看Optionals/AtomicReferences是否有新值。如果有,请将其添加到数组列表中,然后将其从原子引用中删除。在下面,循环遍历数组列表并绘制其中包含的所有图形对象。

通过向按钮中添加匿名ActionListener,您可以完成正在尝试的操作(请参见下文)。您需要将MyPanel
设置为final
,或者将其设置为包含
fram
的成员,以便以后可以引用

注意:在这种设计中,使
MyPanel
成为
fram
的内部类和
circZ
成为
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);
  }

您需要实现以下方法:

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);
}

必须将
ActionListener
添加到
JFrame
。因此,我将在
fram
类中执行事件处理,因为它扩展了
JFrame
,并将其声明为:
公共类fram extends JFrame implements ActionListener
。这有帮助吗?另外,您需要语句
addActionListener(this)
fram
类构造函数中。向下投票,正如在发布的代码中,无法引用ActionListener中的MyPanel向下投票,正如在发布的代码中,无法引用ActionListener中的MyPanel。我没有给出填鸭式回答。我提供了应该如何处理的基础。Jacob你至少应该提到范围问题,即使你不想“填鸭式”说实话,我也没有深入研究。我更关心的是如何处理未来的继续医学教育。