【问题标题】:Program will recognize certain key inputs but not others.程序将识别某些关键输入,但不能识别其他输入。
【发布时间】:2015-05-18 09:52:48
【问题描述】:

程序应该绘制用户制作的形状。当用户按下“c”键时,应该能够在屏幕上拖动鼠标绘制一个圆圈。当用户按下“r”时,他们应该绘制一个矩形。当按下“l”时,应该画一条线。当按下“o”时,应制作一个椭圆形。但是,由于某种原因,只能制作键“c”和“r”。如果未输入使用输入,则程序应默认为圆形。但是,按“l”和“o”不会画出椭圆或线。

/**
 * @(#)DrawShapes.java
 *
 *
 * @author
 * @version 1.00 2015/5/17
 */

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 void keyPressed(KeyEvent event)
    {
        char temp = event.getKeyChar();
        key = Character.toString(temp);

    }


 public void keyTyped (KeyEvent event) {}
    public void keyReleased (KeyEvent event) {}

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

  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.max(lx1, lx2), Math.max(ly1, ly2));
    }


  }

}

...

/**
 * @(#)ShapeViewer.java
 *
 *
 * @author
 * @version 1.00 2015/5/17
 */
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);
    }


}

【问题讨论】:

  • 要么这样,要么确实如此,但不是你假设的变量。你能调试你的代码并在这些行上添加断点吗?

标签: java jframe geometry keylistener mouselistener


【解决方案1】:

你的问题来了

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

唯一可以工作的输入是"r" 和一个圆圈,如果你按"l" 然后它会做r=makeLine(startDrag.x, startDrag.y, endDrag.x, endDrag.y) 然后下面的if 测试会做r = makeCircle(startDrag.x, startDrag.y, endDrag.x, endDrag.y);

您需要将所有 if 语句与 else 语句连接起来。

    if (key.equals("l")) {
         r = makeLine(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
    } else if (key.equals("o")) {
         r = makeOval(startDrag.x, startDrag.y, endDrag.x, endDrag.y);
    } else 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);
    }

【讨论】:

  • so .... 你假设 key 同时有两个值?这没有任何意义。
  • @Stultuske 没有我知道 r 的值将被除"r" 之外的任何值的最后一个 if/else 语句覆盖。看看那个代码块的流程。
  • 啊,我误会了。我的坏
猜你喜欢
  • 1970-01-01
  • 2017-01-16
  • 2010-11-03
  • 1970-01-01
  • 2015-01-19
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 2015-11-23
相关资源
最近更新 更多