編寫一個應該在給出指令時繪製形狀的程序。 以下是說明。但是每當我編譯我得到的消息編譯器錯誤說我不重寫抽象方法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);
}
}
該方法不在'DrawShapes'類中,而是'PaintSurface'。 – Kayaman