编译器错误说我没有覆盖抽象方法keyReleased

时间:2015-05-18 07:59:28

标签: java jframe geometry keylistener mouselistener

编写一个应该在给定指令时绘制形状的程序。 以下是说明。但是每当我编译时,我都会得到消息

  

DrawShapes不是抽象的,并且不会覆盖java.awt.event.KeyListener中的抽象方法keyReleased(java.awt.event.KeyEvent)。

我已经将方法$(document).ready(function(){ $('#example').popover(); $("form").find('input[type="radio"]').on('change', function() { alert($('input[name=keys]:checked').val()); }); });放在程序中,所以我不知道为什么它一直说我没有覆盖抽象方法keyReleased。我无法编译该程序,但我也相当确定该程序即使编译也无法工作。谢谢!

  

编写一个程序,允许用户使用鼠标绘制形状。   要绘制的形状应该由keyPressed事件使用   以下键:c绘制圆形,o绘制椭圆形,r绘制矩形   我画了一条线。形状的大小和位置应该是   由mousePressed和mouseReleased事件确定。显示名称   在南部地区的JLabel中的当前形状   BorderLayout的。初始形状应默认为圆形。使   确保形状显示在鼠标移动的方向上。   使用JFrame和Paint。你应该有两个文件:ShapesViewer和   DrawShapes(20分)

keyReleased

...

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.geom.Line2D;
import java.awt.geom.Rectangle2D;
import java.util.ArrayList;
import java.awt.geom.Ellipse2D;
import java.awt.event.KeyEvent;


import javax.swing.JComponent;
import javax.swing.JFrame;

public class DrawShapes extends JFrame implements KeyListener{
String key;


  public DrawShapes()
  {
    this.setSize(300, 300);
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.add(new PaintSurface(), BorderLayout.CENTER);
    this.setVisible(true);
  }

  private class PaintSurface extends JComponent
  {
    ArrayList<Shape> shapes = new ArrayList<Shape>();

    Point startDrag, endDrag;

    public PaintSurface() {


      this.addMouseListener(new MouseAdapter()
      {
        public void mousePressed(MouseEvent e) {
          startDrag = new Point(e.getX(), e.getY());
          endDrag = startDrag;
          repaint();
        }

        public void mouseReleased(MouseEvent e) {
                  Shape r;


        if (key.equals("l"))
        {
             r = makeLine(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
        }



        if (key.equals("o"))
        {
             r = makeOval(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
        }

        if (key.equals("r"))
        {
             r = makeRectangle(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
        }


        else
        {
            r = makeCircle(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
        }

          shapes.add(r);
          startDrag = null;
          endDrag = null;
          repaint();
        }
      });


      this.addMouseMotionListener(new MouseMotionAdapter()
      {
        public void mouseDragged(MouseEvent e) {
          endDrag = new Point(e.getX(), e.getY());
          repaint();
        }
      });
    }
    private void paintBackground(Graphics2D g2){
      g2.setPaint(Color.LIGHT_GRAY);



    }
    public void paint(Graphics g) {
      Graphics2D g2 = (Graphics2D) g;




      for (Shape s : shapes)
      {
        g2.setPaint(Color.BLACK);
        g2.draw(s);
        g2.fill(s);
      }

      if (startDrag != null && endDrag != null) {
        g2.setPaint(Color.LIGHT_GRAY);
        Shape r;


        if (key.equals("l"))
        {
             r = makeLine(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
        }



        if (key.equals("o"))
        {
             r = makeOval(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
        }

        if (key.equals("r"))
        {
             r = makeRectangle(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
        }


        else
        {
            r = makeCircle(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
        }

        g2.draw(r);
      }
    }

    private Rectangle2D.Float makeRectangle(int x1, int y1, int x2, int y2)
    {
      return new Rectangle2D.Float(Math.min(x1, x2), Math.min(y1, y2), Math.abs(x1 - x2), Math.abs(y1 - y2));
    }

    private Ellipse2D.Float makeCircle(int cx1, int cy1, int cx2, int cy2)
    {
      return new Ellipse2D.Float(Math.min(cx1, cx2), Math.min(cy1, cy2), Math.abs(cx1 - cx2), Math.abs(cx1 - cx2));
    }

    private Ellipse2D.Float makeOval(int ox1, int oy1, int ox2, int oy2)
    {
      return new Ellipse2D.Float(Math.min(ox1, ox2), Math.min(oy1, oy2), Math.abs(ox1 - ox2), Math.abs(oy1 - oy2));
    }

        private Line2D.Float makeLine(int lx1, int ly1, int lx2, int ly2)
    {
      return new Line2D.Float(Math.min(lx1, lx2), Math.min(ly1, ly2), Math.abs(lx1 - lx2), Math.abs(ly1 - ly2));
    }

    public void keyPressed(KeyEvent event)
    {
        key = event.getKeyText(event.getKeyCode());
    }


    public void keyReleased(KeyEvent event)
    {

    }

    //handle press of any action key
    public void keyTyped(KeyEvent event)
    {

    }

  }
}

1 个答案:

答案 0 :(得分:1)

是的,但这不是在DrawShape类中,而是在它的私有内部类PaintSurface中。将该方法移动到DrawShape类中。