javaProgrammer
javaProgrammer

Reputation: 67

Program will recognize certain key inputs but not others.

The program should draw shapes the user makes. When the user presses the key "c" the should be able to drag their mouse across the screen drawing a circle. When the user presses "r" they should draw a rectangle. When "l" is pressed a line should be drawn. When "o" is pressed an oval should be made. However, only key "c" and "r" can be made for some reason. If no use input is inputted the program should default to a circle. However pressing "l" and "o" does not draw an oval or line.

/**
 * @(#)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);
    }


}

Upvotes: 0

Views: 40

Answers (1)

ug_
ug_

Reputation: 11440

Your problem is here

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

The only inputs that will work are "r" and a circle, if you press "l" then it will do r=makeLine(startDrag.x, startDrag.y, endDrag.x, endDrag.y) then the following if test will do r = makeCircle(startDrag.x, startDrag.y, endDrag.x, endDrag.y);

You need to join all the if statements with else statements.

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

Upvotes: 2

Related Questions