2015-05-18 42 views
0

編寫一個應該在給出指令時繪製形狀的程序。 以下是說明。但是每當我編譯我得到的消息編譯器錯誤說我不重寫抽象方法keyReleased

DrawShapes不是抽象的,不重寫抽象方法的keyReleased(java.awt.event.KeyEvent中)在java.awt.event.KeyListener」。

我已經把方法keyReleased放在程序中,所以我不知道它爲什麼一直說我沒有覆蓋抽象方法keyReleased。我還沒有能夠編譯程序,但我也相當確定如果編譯後的程序甚至不工作。謝謝!

編寫一個允許用戶用鼠標繪製形狀的程序。 要繪製的形狀應由keyPressed事件使用以下關鍵字使用 確定:c繪製一個圓,o繪製一個橢圓,r繪製一個矩形 並繪製一條線。形狀的大小和位置應該是由mousePressed和mouseReleased事件確定的 。在一個 BorderLayout的SOUTH區域的JLabel中顯示當前形狀的名稱 。初始形狀應該默認爲一個圓圈。使 確保形狀顯示在鼠標移動的方向上。 使用JFrame和Paint。你應該有兩個文件:ShapesViewer和 DrawShapes(20分)

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) 
    { 

    } 

    } 
} 

......

import javax.swing.*; 

public class ShapeViewer 
{ 

    //Creates and displays the application frame 
    public static void main(String[] args) 
    { 
     JFrame ShapeViewer = new JFrame("Draw Stuff"); 
     ShapeViewer.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     ShapeViewer.getContentPane().add(new DrawShapes()); 

     ShapeViewer.pack(); 
     ShapeViewer.setVisible(true); 
    } 


} 
+2

該方法不在'DrawShapes'類中,而是'PaintSurface'。 – Kayaman

回答

1

是的,但這不是在DrawShape類,但在它的私有的內部類PaintSurface。將該方法移到DrawShape類中。

+0

謝謝,它編譯它,但程序是完全怪胎不幸的。 – javaProgrammer

+0

你是什麼意思,「它編譯它,但程序是怪人」?你的意思是你發佈的代碼編譯了嗎? – Stultuske

+0

該程序編譯得很好,但是當我嘗試運行它並繪製諸如橢圓和圓形之類的形狀時,我得到了一個我不確定如何理解或閱讀的錯誤列表。以下是我嘗試運行該程序時的錯誤。 http://i.imgur.com/ZIZq2Jr.png – javaProgrammer

相關問題