Question

Compile and execute the application. You will discover that is has a bug in it -...

Compile and execute the application. You will discover that is has a bug in it - the filled checkbox has no effect - filled shapes are not drawn.

Your first task is to debug the starter application so that it correctly draws filled shapes. The bug can be corrected with three characters at one location in the code.

Java 2D introduces many new capabilities for creating unique and impressive graphics. We’ll add a small subset of these features to the drawing application you created in Exercise 12.17. Code for this is included.In this version, you’ll enable the user to specify gradients for filling shapes and to change stroke characteristics for drawing lines and outlines of shapes. The user will be able to choose which colors compose the gradient and set the width and dash length of the stroke.

First, you must update the MyShape hierarchy to support Java 2D functionality. Make the following changes in class MyShape:

a)      Change abstract method draw’s parameter type from Graphics to Graphics2D.

b)      Change all variables of type Color to type Paint to enable support for gradients. [Note:Recall that class Color implements interface Paint.]

c)      Add an instance variable of type Stroke in class MyShape and a Stroke parameter in the constructor to initialize the new instance variable. The default stroke should be an instance of class BasicStroke.

Classes MyLine, MyBoundedShape, MyOval and MyRectangle should each add a Stroke parameter to their constructors. In the draw methods, each shape should set the Paint and the Stroke before drawing or filling a shape. Since Graphics2D is a subclass of Graphics, we can continue to use Graphics methods drawLine, drawOval, fillOval, and so on to draw the shapes. When these methods are called, they’ll draw the appropriate shape using the specified Paint and Stroke settings.

Next, you’ll update the DrawPanel to handle the Java 2D features. Change all Color variables to Paint variables. Declare an instance variable currentStroke of type Stroke and provide a setmethod for it. Update the calls to the individual shape constructors to include the Paint and Stroke arguments. In method paintComponent, cast the Graphics reference to type Graphics2D and use the Graphics2D reference in each call to MyShape method draw.

Next, make the new Java 2D features accessible from the GUI. Create a JPanel of GUI components for setting the Java 2D options. Add these components at the top of the DrawFrame below the panel that currently contains the standard shape controls These GUI components should include:

a)      A checkbox to specify whether to paint using a gradient.

b)      Two JButtons that each show a JColorChooser dialog to allow the user to choose the first and second color in the gradient. (These will replace the JComboBox used for choosing the color in Exercise 12.17.)

c)      A text field for entering the Stroke width.

d)      A text field for entering the Stroke dash length.

e)      A checkbox for selecting whether to draw a dashed or solid line.

import java.awt.Color;

import java.awt.Graphics;

public abstract class MyShape

{

   private int x1;      // x coordinate of first endpoint

   private int y1;      // y coordinate of first endpoint

   private int x2;      // x coordinate of second endpoint

   private int y2;      // y coordinate of second endpoint

   private Color color; // color of this shape

   //--------------------------------------------------------------------

   // no-arg constructor

   //--------------------------------------------------------------------

   public MyShape()

   {

      this(0, 0, 0, 0, Color.BLACK);

   }

   //--------------------------------------------------------------------

   // constructor with location and color parameters

   //--------------------------------------------------------------------

   public MyShape(int x1, int y1, int x2, int y2, Color color)

   {

      this.x1 = (x1 >= 0 ? x1 : 0);

      this.y1 = (y1 >= 0 ? y1 : 0);

      this.x2 = (x2 >= 0 ? x2 : 0);

      this.y2 = (y2 >= 0 ? y2 : 0);

      this.color = color;

   }

   public void setX1(int x1)

   {

      this.x1 = (x1 >= 0 ? x1 : 0);

   }

   public int getX1()

   {

      return x1;

   }

   public void setX2(int x2)

   {

      this.x2 = (x2 >= 0 ? x2 : 0);

   }

   public int getX2()

   {

      return x2;

   }

   public void setY1(int y1)

   {

      this.y1 = (y1 >= 0 ? y1 : 0);

   }

  

   public int getY1()

   {

      return y1;

   }

   public void setY2(int y2)

   {

      this.y2 = (y2 >= 0 ? y2 : 0);

   }

   public int getY2()

   {

      return y2;

   }

   public void setColor(Color color)

   {

      this.color = color;

   }

   public Color getColor()

   {

      return color;

   }

   public abstract void draw(Graphics g);

} // end class MyShape

}

import java.awt.Color;

import java.awt.Graphics;

public class MyRect extends MyBoundedShape

{

   //--------------------------------------------------------------------

   // no-arg constructor

   //--------------------------------------------------------------------

   public MyRect()

   {

      // just calls default superclass constructor

   }

   //--------------------------------------------------------------------

   // constructor with location, color and fill parameters

   //--------------------------------------------------------------------

   public MyRect(int x1, int y1, int x2, int y2,

                 Color color, boolean filled)

   {

      super(x1, y1, x2, y2, color, filled);

   }

   // draw rectangle

   public void draw(Graphics g)

   {

      g.setColor(getColor());

     

      if (isFilled())

         g.fillRect(getUpperLeftX(), getUpperLeftY(),

            getWidth(), getHeight());

      else

         g.drawRect(getUpperLeftX(), getUpperLeftY(),

            getWidth(), getHeight());

   }

} // end class MyRec

import java.awt.Color;

import java.awt.Graphics;

public class MyOval extends MyBoundedShape

{

   //--------------------------------------------------------------------

   // no-arg constructor

   //--------------------------------------------------------------------

   public MyOval()

   {

      // just calls default superclass constructor

   }

   //--------------------------------------------------------------------

   // constructor with location, color and fill parameters

   //--------------------------------------------------------------------

   public MyOval(int x1, int y1, int x2, int y2,

                 Color color, boolean isFilled)

   {

      super(x1, y1, x2, y2, color, isFilled);

   }

   // draw oval

   public void draw(Graphics g)

   {

      g.setColor(getColor());

      if (isFilled())

         g.fillOval(getUpperLeftX(), getUpperLeftY(),

            getWidth(), getHeight());

      else

         g.drawOval(getUpperLeftX(), getUpperLeftY(),

            getWidth(), getHeight());

   }

} // end class MyOval

import java.awt.Color;

import java.awt.Graphics;

public class MyLine extends MyShape

{

   //--------------------------------------------------------------------

   // no-arg constructor

   //--------------------------------------------------------------------

   public MyLine()

   {

      // just calls default superclass constructor

   }

   //--------------------------------------------------------------------

   // constructor with location and color parameters

   //--------------------------------------------------------------------

   public MyLine(int x1, int y1, int x2, int y2, Color color)

   {

      super(x1, y1, x2, y2, color);

   }

   // draw line in specified color

   public void draw(Graphics g)

   {

      g.setColor(getColor());

      g.drawLine(getX1(), getY1(), getX2(), getY2());

   }

} // end class MyLine

import java.awt.Color;

import java.awt.Graphics;

public abstract class MyBoundedShape extends MyShape

{

   private boolean filled; // whether this shape is filled

  

   //--------------------------------------------------------------------

   // no-arg constructor

   //--------------------------------------------------------------------

   public MyBoundedShape()

   {

      this.filled = false;

   }

   //--------------------------------------------------------------------

   // constructor with location parameters

   //--------------------------------------------------------------------

   public MyBoundedShape(int x1, int y1, int x2, int y2,

                         Color color, boolean isFilled)

   {

      super(x1, y1, x2, y2, color);

      this.filled = filled;

   }

   public int getUpperLeftX()

   {

      return Math.min(getX1(), getX2());

   }

   public int getUpperLeftY()

   {

      return Math.min(getY1(), getY2());

   }

   public int getWidth()

   {

      return Math.abs(getX2() - getX1());

   }

   public int getHeight()

   {

      return Math.abs(getY2() - getY1());

   }

   public boolean isFilled()

   {

      return filled;

   }

   public void setFilled(boolean filled)

   {

      this.filled = filled;

   }

} // end class MyBoundedShape

import javax.swing.JFrame;

public class InteractiveDrawingApplication

{

   public static void main(String[] args)

   {

      DrawFrame application = new DrawFrame();

      application.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      application.setSize(500, 400);

      application.setVisible(true);

   }

} // end class InteractiveDrawingApplication

import java.awt.Color;

import java.awt.Graphics;

import java.awt.event.MouseAdapter;

import java.awt.event.MouseEvent;

import java.awt.event.MouseMotionListener;

import javax.swing.JLabel;

import javax.swing.JPanel;

public class DrawPanel extends JPanel

{

   private MyShape[] shapes;      // array containing all the shapes

   private int shapeCount;        // total number of shapes

   private int shapeType;         // type of shape to draw

   private MyShape currentShape; // current shape being drawn

   private Color currentColor;    // color of the shape

   private boolean filledShape;   // whether this shape is filled

   private JLabel statusLabel;    // label to display mouse coordinates

   //--------------------------------------------------------------------

   // constructor

   //--------------------------------------------------------------------

   public DrawPanel(JLabel status)

   {

      shapes = new MyShape[100];

      shapeCount = 0;               // initially we have no shapes

      setShapeType(0);              // initially set to draw lines

      setDrawingColor(Color.BLACK); // start drawing with black

      setFilledShape(false);        // not filled by default

      currentShape = null;

      setBackground(Color.WHITE);

      // add the mouse listeners

      MouseHandler mouseHandler = new MouseHandler();

      addMouseListener(mouseHandler);

      addMouseMotionListener(mouseHandler);

      // set the status label for displaying mouse coordinates

      statusLabel = status;

   } // end DrawPanel constructor

   // draw shapes polymorphically

   public void paintComponent(Graphics g)

   {

      super.paintComponent(g);

     for (int i = 0; i < shapeCount; i++)

         shapes[i].draw(g);

      if (currentShape != null)

         currentShape.draw(g);

   }

   // set type of shape to draw

   public void setShapeType(int shapeType)

   {

      if (shapeType < 0 || shapeType > 2)

         shapeType = 0;

      this.shapeType = shapeType;

   }

   // set drawing color

   public void setDrawingColor(Color c)

   {

      currentColor = c;

   }

   // clear last shape drawn

   public void clearLastShape()

   {

      if (shapeCount > 0)

      {

         shapeCount--;

         repaint();

      }

   }

   // clear all drawings on this panel

   public void clearDrawing()

   {

      shapeCount = 0;

      repaint();

   }

   // set whether shape is filled

   public void setFilledShape(boolean isFilled)

   {

      filledShape = isFilled;

   }

   // handle mouse events for this JPanel

   private class MouseHandler extends MouseAdapter

      implements MouseMotionListener

   {

      // creates and sets the initial position for the new shape

      public void mousePressed(MouseEvent e)

      {

         if (currentShape != null)

            return;

         // create requested shape

         switch (shapeType)

         {

            case 0:

               currentShape = new MyLine(e.getX(), e.getY(), e.getX(), e.getY(), currentColor);     

               break;

            case 1:

               currentShape = new MyOval(e.getX(), e.getY(), e.getX(), e.getY(), currentColor, filledShape);     

               break;

            case 2:

               currentShape = new MyRect(e.getX(), e.getY(), e.getX(), e.getY(), currentColor, filledShape);     

               break;

         }

      }

      // fix current shape onto the panel

      public void mouseReleased(MouseEvent e)

      {

         if (currentShape == null)

            return;

         // set the second point on the shape

         currentShape.setX2(e.getX());

         currentShape.setY2(e.getY());

         // set the shape only if there is room in the array

         if (shapeCount < shapes.length)

         {

            shapes[shapeCount] = currentShape;

            shapeCount++;

         }

         currentShape = null; // clear the temporary drawing shape    

         repaint();

      }

      // update shape to current mouse position while dragging

      public void mouseDragged(MouseEvent e)

      {

         if (currentShape != null)

         {

            currentShape.setX2(e.getX());

            currentShape.setY2(e.getY());

            repaint();

         }

         mouseMoved(e); // update status bar

      }

      // update status bar to show current mouse coordinates

      public void mouseMoved(MouseEvent e)

      {

         statusLabel.setText(

            String.format("(%d,%d)", e.getX(), e.getY()));

      }

   } // end class MouseHandler

} // end class DrawPanel

import java.awt.BorderLayout;

import java.awt.Color;

import java.awt.FlowLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.awt.event.ItemEvent;

import java.awt.event.ItemListener;

import javax.swing.JButton;

import javax.swing.JCheckBox;

import javax.swing.JComboBox;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JPanel;

public class DrawFrame extends JFrame

   implements ItemListener, ActionListener

{

   // Array of possible colors

   private Color[] colors = { Color.BLACK, Color.BLUE, Color.CYAN,

                              Color.DARK_GRAY, Color.GRAY, Color.GREEN,

                                                                                                                Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,

                                                                                                                Color.PINK, Color.RED, Color.WHITE, Color.YELLOW };

   // Array of names corresponding to the possible colors

   private String[] colorNames = {"Black", "Blue", "Cyan", "Dark Gray", "Gray",

                                  "Green", "Light Gray", "Magenta", "Orange",

                                                                                                                                "Pink", "Red", "White", "Yellow"};

   // Array of possible shape names

   private String[] shapes = {"Line", "Oval", "Rectangle"};

   private DrawPanel drawPanel; // panel to contain the drawin

   private JButton undoButton;

   private JButton clearButton;

   private JComboBox<String> colorChoices;

   private JComboBox<String> shapeChoices;

   private JCheckBox filledCheckBox; // check box to toggle whether shapes have fil

   //--------------------------------------------------------------------

   // constructor

   //--------------------------------------------------------------------

   public DrawFrame()

   {

      super("Java Drawings");

      // create a panel to store the components at the top of the frame

      JPanel topPanel = new JPanel();

      undoButton = new JButton("Undo");

      undoButton.addActionListener(this);

      topPanel.add(undoButton);

      clearButton = new JButton("Clear");

      clearButton.addActionListener(this);

      topPanel.add(clearButton);

      colorChoices = new JComboBox<String>(colorNames);

      colorChoices.addItemListener(this);

      topPanel.add(colorChoices);

      shapeChoices = new JComboBox<String>(shapes);

      shapeChoices.addItemListener(this);

      topPanel.add(shapeChoices);     

      filledCheckBox = new JCheckBox("Filled");

      filledCheckBox.addItemListener(this);

      topPanel.add(filledCheckBox);

      // add the top panel to the frame

      add(topPanel, BorderLayout.NORTH);

      // create a label for the status bar

      JLabel statusLabel = new JLabel("(0,0)");

      // add the status bar at the bottom

      add(statusLabel, BorderLayout.SOUTH);

      // create the DrawPanel with its status bar label

      drawPanel = new DrawPanel(statusLabel);

      add(drawPanel); // add the drawing area to the center     

   } // end DrawFrame constructor

   // handle selections made to a combobox or checkbox

   public void itemStateChanged(ItemEvent e)

   {

      if (e.getSource() == shapeChoices) // choosing a shape

         drawPanel.setShapeType(shapeChoices.getSelectedIndex());

      else if (e.getSource() == colorChoices) // choosing a color

         drawPanel.setDrawingColor(

            colors[colorChoices.getSelectedIndex()]);

      else if (e.getSource() == filledCheckBox) // filled/unfilled

         drawPanel.setFilledShape(filledCheckBox.isSelected());

   }

   // handle button clicks

   public void actionPerformed(ActionEvent e)

   {

      if (e.getSource() == undoButton)

         drawPanel.clearLastShape();

      else if (e.getSource() == clearButton)

         drawPanel.clearDrawing();

   }

} // end class DrawFrame

Homework Answers

Answer #1

Java2D.java

import javax.swing.JFrame;
import java.awt.Dimension;

public class Java2D {

   public static void main(String[] args) {
      DrawFrame newframe = new DrawFrame();
      newframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      newframe.setSize(900,900);
      //newframe.setMinimumSize(new Dimension(800,800));
      newframe.setVisible(true);
    
   }

}

DrawFrame.java

import java.awt.BasicStroke;
import java.awt.Dimension;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.GradientPaint;
import java.awt.Paint;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import javax.swing.*;

public class DrawFrame extends JFrame {

   private final DrawPanel DrawPad;
   private final JPanel MenuPanel;
   private final JPanel Statusbar;
   private final JLabel status= new JLabel("move the mouse");
   private final JButton Undo;
   private final JButton Clear;
   private final JComboBox options;
   private final String[] array = {"Line","Oval","Rectangle"};
   private final JLabel Shape;
   private final JLabel Filled;
   private final JCheckBox fCheck;
   private final JCheckBox Grad;
   private final JButton C1;
   private final JButton C2;
   private final JLabel lw; //line width label
   private final JLabel dl; //line length label
   private final JLabel dashed; //dashed label
   private final JTextField w;//line width
   private final JTextField l; //line length
   private final JCheckBox d; //for dashed lines
   private Color color1 = Color.BLACK;
   private Color color2 = Color.BLACK;


   public DrawFrame()
   {
      super("Welcome to 2D drawing");
      setLayout(new BorderLayout());
    
      DrawPad = new DrawPanel(status);
      //DrawPad.setBackground(Color.WHITE);
      add(DrawPad, BorderLayout.CENTER);
    
      MenuPanel= new JPanel();
      //MenuPanel.setBackground(Color.YELLOW);
      add(MenuPanel, BorderLayout.NORTH);
    
      Statusbar = new JPanel();
      //Statusbar.setBackground(Color.RED);
      add(Statusbar, BorderLayout.SOUTH);
    
      MenuPanel.setPreferredSize(new Dimension(350,100));
    
      Undo= new JButton("Undo");
      MenuPanel.add(Undo);
    
      Clear = new JButton("Clear");
      MenuPanel.add(Clear);
    
      Shape = new JLabel("Shape:");
      MenuPanel.add(Shape);
    
      options = new JComboBox(array);
      options.setMaximumRowCount(3);
      options.setSelectedIndex(0);
      //handleer for mouse
      options.addItemListener(
              new ItemListener()
              {
                 @Override
                 public void itemStateChanged(ItemEvent event)
                 {
                    if(event.getStateChange()== ItemEvent.SELECTED)
                       DrawPad.setshapeType(options.getSelectedIndex());
                  
                 }
               
              }
   
      );
    
      MenuPanel.add(options);
    
      fCheck = new JCheckBox();
      MenuPanel.add(fCheck);
    
      Filled = new JLabel("Filled");
      MenuPanel.add(Filled);
    
      Grad = new JCheckBox("Use Gradient");
      MenuPanel.add(Grad);
   
      C1 = new JButton("1st Color");
      MenuPanel.add(C1);
    
      C2 = new JButton("2nd Color");
      MenuPanel.add(C2);
    
      lw = new JLabel("Line Width");
      MenuPanel.add(lw);
    
      w = new JTextField(3);
      MenuPanel.add(w);
    
      dl = new JLabel("Dash Length");
      MenuPanel.add(dl);
    
      l = new JTextField(3);
      MenuPanel.add(l);
    
      d = new JCheckBox();
      MenuPanel.add(d);
    
      dashed = new JLabel("Dashed");
      MenuPanel.add(dashed);
    
       Statusbar.add(status);
       Statusbar.setLayout(new FlowLayout(FlowLayout.LEFT));
     
    //register event handlers
      TextFieldHandler TxHandler = new TextFieldHandler();
      l.addActionListener(TxHandler);
      w.addActionListener(TxHandler);
    
      ButtonHandler BtHandler = new ButtonHandler();
      Undo.addActionListener(BtHandler);
      Clear.addActionListener(BtHandler);
      C1.addActionListener(BtHandler);
      C2.addActionListener(BtHandler);
    
      CheckBoxHandler CkHandler = new CheckBoxHandler();
      fCheck.addItemListener(CkHandler);
      Grad.addItemListener(CkHandler);
      d.addItemListener(CkHandler);

   }
    private class CheckBoxHandler implements ItemListener
   {
      @Override
      public void itemStateChanged(ItemEvent event)
      {
         DrawPad.setfilledShape(fCheck.isSelected());
         DrawPad.setgradpaint(Grad.isSelected());
         DrawPad.setDashed(d.isSelected());
      }  
   }
  
   private class ButtonHandler implements ActionListener
   {
      @Override
      public void actionPerformed(ActionEvent event)
      {
            if(event.getSource()==Undo)
            {
               DrawPad.clearLastShape();
            }
            else if(event.getSource() == Clear)
            {
               DrawPad.clearDrawing();
            }
            else if(event.getSource()==C1)
            {
               color1=JColorChooser.showDialog(null,"pick your color",color1);
               DrawPad.setColor1(color1);
               //DrawPad.setcurrentPaint(color1);
            }
            else if(event.getSource()==C2)
            {
               color2=JColorChooser.showDialog(null,"pick your color",color2);
               DrawPad.setColor2(color2);
            }
          
            repaint();
          
      }
   }
   private class TextFieldHandler implements ActionListener
   {
      @Override
      public void actionPerformed(ActionEvent event)
      {
         if(event.getSource()==w)
            DrawPad.setWidth(Integer.parseInt(event.getActionCommand()));
         else
            DrawPad.setLength(Integer.parseInt(event.getActionCommand()));
       
      }
   }
}

DrawPanel.java

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.GradientPaint;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Stroke;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.event.MouseAdapter;

public class DrawPanel extends JPanel {

    private MyShape[] shapes = new MyShape[100];
    private int shapeCount;
    private int shapeType;
    private MyShape currentShape;
    private Paint currentPaint;
    private boolean filledShape; //f
    private boolean gradpaint; //
    private boolean dashed;
    private final JLabel statusLabel;
    private Stroke currentStroke;
    private Paint p=Color.BLACK;
    private Color color1=Color.BLACK;
    private Color color2= Color.BLACK;
    private float length=0;
    private int width=0;
    private float[] dashes = new float[1];

   public DrawPanel(JLabel lab)
   {
    statusLabel = lab;
    shapeCount=0;
    shapeType=0;
    currentShape=null;
    currentStroke=new BasicStroke();
    currentPaint=Color.BLACK;
    filledShape=false;
    length=0;
    width=0;
    setBackground(Color.WHITE);

    MouseHandler handler = new MouseHandler();
    addMouseListener(handler);
    addMouseMotionListener(handler);
   }

   @Override
   public void paintComponent(Graphics g)
   {
      Graphics2D g2 = (Graphics2D) g;
    
      super.paintComponent(g2);
    
      for(int i=0; i<shapeCount;i++)
       shapes[i].draw(g2);
      if(currentShape!=null)
      currentShape.draw(g2);
   }

   public void setshapeType(int s)
   {
      shapeType=s;
   }

   public void setcurrentPaint(Paint p)
   {
      currentPaint=p;
   }
   public void setgradpaint(boolean f)
   {
      gradpaint = f;
   }

   public void setfilledShape(boolean f)
   {
      filledShape=f;
   }
   public void setStroke(Stroke s)
   {
      currentStroke=s;
   }
   public void clearLastShape()
   {
      shapeCount--;
      repaint();
   }
   public void clearDrawing()
   {
      shapeCount=0;
      repaint();
   }
   public void setDashed(boolean d)
   {
      dashed=d;
   }
   public void setColor1(Color color1) {
      this.color1 = color1;
   }
   public void setColor2(Color color2) {
      this.color2 = color2;
   }


   public void setLength(float length) {
      this.length = length;
   }

   public void setWidth(int width) {
      this.width = width;
   }
   private class MouseHandler extends MouseAdapter implements MouseMotionListener
   {
   
      @Override
      public void mousePressed(MouseEvent event)
      {
         int xpos = event.getX();
         int ypos = event.getY();
         setcurrentPaint(color1);//initial current paint to color1
         setLength(length);
         setWidth(width);
         setStroke(new BasicStroke(width,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
       
         if(gradpaint&&dashed)
         {
            setcurrentPaint(new GradientPaint(0,0,color1,50,50,color2,true));
            setStroke(new BasicStroke(width,BasicStroke.CAP_ROUND,BasicStroke.JOIN_BEVEL,0,new float[]{10,length},0));
          
         }
         else if(gradpaint)
         {
            setcurrentPaint(new GradientPaint(0,0,color1,50,50,color2,true));
          
         }
         else if (filledShape)
         {
            setfilledShape(true);
          
         }
         else if(dashed)
         {
            setStroke(new BasicStroke(width,BasicStroke.CAP_ROUND,BasicStroke.JOIN_BEVEL,0,new float[]{10,length},0));
         }
         else
         {
            setfilledShape(false);
            setcurrentPaint(color1);
            setStroke(new BasicStroke(width,BasicStroke.CAP_ROUND,BasicStroke.JOIN_ROUND));
          
         }
         if(shapeType==0)
         {
            currentShape= new MyLine();
            currentShape.setX1(xpos);
            currentShape.setY1(ypos);
            currentShape.setPaint(currentPaint);
            currentShape.setStroke(currentStroke);
         }
         if(shapeType==1)
         {
            currentShape = new MyOval(xpos,ypos,xpos,ypos,currentPaint,currentStroke,filledShape);
         
         }
         if(shapeType==2)
         {
            currentShape = new MyRectangle(xpos,ypos,xpos,ypos,currentPaint,currentStroke,filledShape);
          
         }
      }
    
      @Override
      public void mouseReleased(MouseEvent event)
      {
         int xpos = event.getX();
         int ypos = event.getY();
       
         currentShape.setX2(xpos);
         currentShape.setY2(ypos);
         shapes[shapeCount]=currentShape;
         shapeCount++;
         currentShape=null;
         repaint();
       
      }
    
      //To show coordinates on status bar
      @Override
      public void mouseMoved(MouseEvent event)
      {
         statusLabel.setText("("+event.getX()+","+event.getY()+")");
      }
    
      //To allow the user to see shape while being dragged
      @Override
      public void mouseDragged(MouseEvent event)
      {
         int xpos = event.getX();
         int ypos = event.getY();
     
         currentShape.setX2(xpos);
         currentShape.setY2(ypos);
       
         statusLabel.setText("("+event.getX()+","+event.getY()+")");
       
         repaint();
      }
    
   }

}

MyShape.java

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Stroke;
import static java.lang.Math.abs;

public abstract class MyShape {
   private int x1;
   private int y1;
   private int x2;
   private int y2;
   private Paint paint;
   private Stroke stroke;

   public MyShape()
   {
      setX1(0);
      setY2(0);
      setX2(0);
      setY2(0);
      setPaint(Color.BLACK);
      setStroke(new BasicStroke());
   }

   public MyShape(int x1,int y1, int x2, int y2, Paint paint, Stroke stroke)
   {
      setX1(x1);
      setY1(y1);
      setX2(x2);
      setY2(y2);
      setPaint(paint);
      setStroke(stroke);
    
   }
   public int getX1() {
      return x1;
   }
   public void setX1(int x1) {
      if(x1>=0)
         this.x1=x1;
      else
         this.x1=0;  
   }
   public int getY1() {
      return y1;
   }
   public void setY1(int y1) {
      if(y1>=0)
         this.y1=y1;
      else
         this.y1=0;
   }
   public int getX2() {
      return x2;
   }
   public void setX2(int x2) {
      if(x2>=0)
         this.x2=x2;
      else
         this.x2=0;
   }
   public int getY2() {
      return y2;
   }
   public void setY2(int y2) {
      if(y2>=0)
         this.y2=y2;
      else
         this.y2=0;
   }
   public Paint getPaint() {
      return paint;
   }
   public void setPaint(Paint paint) {
      this.paint = paint;
   }
   public Stroke getStroke()
   {
      return stroke;
   }
   public void setStroke(Stroke stroke)
   {
      this.stroke = stroke;
   }

   public abstract void draw(Graphics2D g);

}

MyLine.java

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Stroke;

public class MyLine extends MyShape{

   public MyLine(int x1,int y1, int x2, int y2, Paint paint, Stroke stroke )
   {
      super(x1,y1,x2,y2,paint,stroke);
    
   }
   public MyLine()
   {
      super(0,0,0,0,Color.BLACK,new BasicStroke());
   }

   @Override
   public void draw(Graphics2D g)
   {
      g.setPaint(super.getPaint());
      g.setStroke(super.getStroke());
      g.drawLine(super.getX1(),super.getY1(),super.getX2(),super.getY2());
   }

}

MyOval.java

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Stroke;
import static java.lang.Math.abs;

public class MyOval extends MyShape {

   private boolean filled;

   //This is one constructor with parameters
   public MyOval(int x1, int y1, int x2, int y2,Paint paint,Stroke stroke, boolean filled)
   {
      super(x1,y1,x2,y2,paint,stroke);
      setFilled(filled);
    
   }

   //This is another constructor without paramemeters
   public MyOval()
   {
      super(0,0,0,0,Color.BLACK,new BasicStroke());
      setFilled(false);
    
   }
   public int getUpperLeftX()
   {
      if(this.getX1()-this.getX2()>0)
         return this.getX2();
      else
         return this.getX1();
   }
   public int getUpperLeftY()
   {
      if(this.getY1()-this.getY2()>0)
         return this.getY2();
      else
         return this.getY1();
   }

   public int getWidth()
   {
      return abs(this.getX1()-this.getX2());
   }

   public int getHeight()
   {
      return abs(this.getY1()-this.getY2());
   }

   public boolean isFilled() {
      return filled;
   }

   public void setFilled(boolean filled) {
      this.filled = filled;
   }
   //The draw method
   @Override
   public void draw(Graphics2D g)
   {
      g.setPaint(super.getPaint());
      g.setStroke(super.getStroke());
      if(isFilled())
         g.fillOval(getUpperLeftX(), getUpperLeftY(), getWidth(), getHeight());
      else
         g.drawOval(getUpperLeftX(), getUpperLeftY(), getWidth(), getHeight());
  
   }

}

MyRectangle.java

import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Paint;
import java.awt.Stroke;
import static java.lang.Math.abs;

public class MyRectangle extends MyShape{

   private boolean filled;

   //This is one constructor with parameters
   public MyRectangle(int x1, int y1, int x2, int y2, Paint paint,Stroke stroke, boolean filled)
   {
      super(x1,y1,x2,y2,paint,stroke);
      setFilled(filled);
   }

   //This is another constructor without paramemeters
   public MyRectangle()
   {
      super(0,0,0,0,Color.BLACK,new BasicStroke());
      setFilled(false);
    
   }
   public int getUpperLeftX()
   {
      return Math.min(getX1(), getX2());
   }
   public int getUpperLeftY()
   {
      return Math.min(getY1(), getY2());
   }
   public int getWidth()
   {
      return abs(this.getX1()-this.getX2());
   }
   public int getHeight()
   {
      return abs(this.getY1()-this.getY2());
   }

   //The draw method
   @Override
   public void draw(Graphics2D g)
   {
      g.setPaint(super.getPaint());
      g.setStroke(super.getStroke());
    
      if(isFilled())
         g.fillRect(getUpperLeftX(), getUpperLeftY(), getWidth(), getHeight());
      else
         g.drawRect(getUpperLeftX(), getUpperLeftY(), getWidth(), getHeight());
   }
   public boolean isFilled() {
      return filled;
   }

   public void setFilled(boolean filled) {
      this.filled = filled;
   }
}


Know the answer?
Your Answer:

Post as a guest

Your Name:

What's your source?

Earn Coins

Coins can be redeemed for fabulous gifts.

Not the answer you're looking for?
Ask your own homework help question
Similar Questions
Homework Draw class diagrams for your HW4 - the Tetris Game shown below: Part 1: UML...
Homework Draw class diagrams for your HW4 - the Tetris Game shown below: Part 1: UML As a review, Here are some links to some explanations of UML diagrams if you need them. • https://courses.cs.washington.edu/courses/cse403/11sp/lectures/lecture08-uml1.pdf (Links to an external site.) • http://creately.com/blog/diagrams/class-diagram-relationships/ (Links to an external site.) • http://www.cs.bsu.edu/homepages/pvg/misc/uml/ (Links to an external site.) However you ended up creating the UML from HW4, your class diagram probably had some or all of these features: • Class variables: names, types, and...
Whenever I try to run this program a window appears with Class not Found in Main...
Whenever I try to run this program a window appears with Class not Found in Main project. Thanks in Advance. * * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ package Assignment10; /** * * @author goodf */ public class Assignment10{ public class SimpleGeometricObject { private String color = "white"; private boolean filled; private java.util.Date dateCreated;    /**...
Describe the following Java code. Give screenshots of the image it produces public class main{ public...
Describe the following Java code. Give screenshots of the image it produces public class main{ public static void main(String[] args{ new MyFrame(); } } import javax.swing.*; public class MyFrame extends JFrame{ MyPanel panel; MyFrame(){ this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); this.add(panel); this.pack(); this.setLocationRelativeTo(null); this.setVisible(true); } } import java.awt.*; import.javax.swing.*; public class MyPanel extends JPanel{ //Image Image; MyPanel(){ //image=new ImageIcon("sky.png").getImage(); this.setPreferredSize(new Dimension(500,500)); } public void paint(Graphics g){ Graphics2D g2D = (Graphics2D) g; //g2D.drawImage(image,0,0,null); g2D.setPaint(Color.blue); g2D.setStroke(new BasicStroke(5)); g2D.drawLine(0,0,500,500); //g2D.setPaint(Colo.pink); //g2D.drawRect(0,0,100,200); //g2D.fillRect(0,0,100,200); //g2D.setPaint(Color.orange); //g2D.drawOval(0,0,100,100); //g2D.fillOval(0,0,100,100); //g2D.setPaint(color.red); //g2D.drawArc(0,0,100,100,0,180); //g2D.fillArc(0,0,100,100,0,180);...
(Sure, take your time. would you like me to post this again?) Thanks in advance !...
(Sure, take your time. would you like me to post this again?) Thanks in advance ! Write the following methods in java class ARM that represent state information as well as functional blocks of the ARM platform. [Go through the following 5 classes then write methods for the instructions: mov, str, ldr, add in class ARM, finally, write a print method for ARM that can display the registers and the memory locations that have been used. (make sure to make...
Q: Implement an equals method for the ADT list that returns true when the entries in...
Q: Implement an equals method for the ADT list that returns true when the entries in one list equal the entries in a second list. In particular, add this method to the class AList. The following is the method header: public boolean equals (Object other) public class AList<T>{ private T list[]; private int capacity = 100; private int numOfEnteries =0; public AList(){ list = (T[])new Object[capacity + 1]; } public void add(T element){ numOfEnteries++; if (numOfEnteries >capacity) System.out.println ("Exceed limit");...
The AssemblyLine class has a potential problem. Since the only way you can remove an object...
The AssemblyLine class has a potential problem. Since the only way you can remove an object from the AssemblyLine array is when the insert method returns an object from the last element of the AssemblyLine's encapsulated array, what about those ManufacturedProduct objects that are "left hanging" in the array because they never got to the last element position? How do we get them out? So I need to edit my project. Here is my AssemblyLine class: import java.util.Random; public class...
Using Java, write a program that allows the user to play the Rock-Paper-Scissors game against the...
Using Java, write a program that allows the user to play the Rock-Paper-Scissors game against the computer through a user interface. The user will choose to throw Rock, Paper or Scissors and the computer will randomly select between the two. In the game, Rock beats Scissors, Scissors beats Paper, and Paper beats Rock. The program should then reveal the computer's choice and print a statement indicating if the user won, the computer won, or if it was a tie. Allow...
package Week7_Quiz; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.scene.control.Label;
package Week7_Quiz; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TextField; import javafx.scene.control.Label; import javafx.stage.Stage; public class Week7_Quiz extends Application { private TextField tf1; private Label stckr; private int revrsdNum; private Button btn; int num = 0; int reverse; public static void main(String[] args) {       launch (args); } @Override public void start(Stage stage) throws Exception { tf1 = new TextField(); tf1.setLayoutX(10); tf1.setLayoutY(50);    stckr =new Label ("Result: "); stckr.setLayoutX(12); stckr.setLayoutY(100);    btn = new Button("Reverse");...
I've posted this question like 3 times now and I can't seem to find someone that...
I've posted this question like 3 times now and I can't seem to find someone that is able to answer it. Please can someone help me code this? Thank you!! Programming Project #4 – Programmer Jones and the Temple of Gloom Part 1 The stack data structure plays a pivotal role in the design of computer games. Any algorithm that requires the user to retrace their steps is a perfect candidate for using a stack. In this simple game you...
1) Consider the following Java program. Which statement updates the appearance of a button? import java.awt.event.*;...
1) Consider the following Java program. Which statement updates the appearance of a button? import java.awt.event.*; import javax.swing.*; public class Clicker extends JFrame implements ActionListener {     int count;     JButton button;     Clicker() {         super("Click Me");         button = new JButton(String.valueOf(count));         add(button);         button.addActionListener(this);         setSize(200,100);         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);         setVisible(true);     }     public void actionPerformed(ActionEvent e) {         count++;         button.setText(String.valueOf(count));     }     public static void main(String[] args) { new Clicker(); } } a. add(button);...
ADVERTISEMENT
Need Online Homework Help?

Get Answers For Free
Most questions answered within 1 hours.

Ask a Question
ADVERTISEMENT