Sunday 20 April 2014

SMALL PAINT APPLICATION IN JAVA



/*
     to run windows application instead of java <classname> use javaw <classname>
*/
import java.util.*;
import java.awt.*;
import java.awt.event.*;
// menus are treated as buttons
class Record
{
     int ox,oy,px,py,w,h;
     Color drawColor;
     String shp;
    
     Record(int ox,int oy,int px,int py,int w, int h, Color drawColor,String shp)
     {
          this.ox=ox;
          this.oy=oy;
          this.px=px;
          this.py=py;
          this.drawColor=drawColor;
          this.w=w;
          this.h=h;
          this.shp=shp;
     }
}   
         
class MyFrame extends Frame implements ActionListener,MouseListener,MouseMotionListener,ItemListener
{
    
     /* all MenuItem are datamembers of the class,
     as we have to handle event based on these items */
    
     CheckboxMenuItem sLin,sRec,sElp,sFrh;
     MenuItem mExit,cBlk,cBlu,cRed,cGrn,cYlo;
    
     String shp=new String(""); // this string will store the shape to be drawn as selected by the user
    
     Color drawColor=new Color(0,0,0); // setting default color to black.
    
     int px,py,ox,oy,w,h;
    
     LinkedList <Record> lst=new LinkedList<Record>();
    
     MyFrame()
     {
          setSize(600,500);
          setLocation(200,100);
          //setResizable(false);
          // this will not allow the user to resize your window
         
          //setBackground(Color.yellow);
          // you can set the Background color in this way
         
          sLin=new CheckboxMenuItem("Line");
          sRec=new CheckboxMenuItem("Rectangle");
          sElp=new CheckboxMenuItem("Elipse");
          sFrh=new CheckboxMenuItem("Free Hand");
         
          mExit=new MenuItem("Exit");
          cBlk=new MenuItem("Black");
          cBlk.setEnabled(false);
          cRed=new MenuItem("Red");
          cGrn=new MenuItem("Green");
          cYlo=new MenuItem("Yellow");
          cBlu=new MenuItem("Blue");
         
          Menu mShape=new Menu("Shape");
          Menu mColor=new Menu("Color");
         
          mShape.add(sLin);
          mShape.add(sRec);
          mShape.add(sElp);
          mShape.add(sFrh);
          mShape.addSeparator(); // to add separator
          mShape.add(mExit);
         
          mColor.add(cBlk);
          mColor.add(cBlu);
          mColor.add(cRed);
          mColor.add(cGrn);
          mColor.add(cYlo);
         
          MenuBar mb=new MenuBar();
          mb.add(mShape);
          mb.add(mColor);
         
          setMenuBar(mb);
         
          addWindowListener(new MyWndAdapter());
         
          sLin.addItemListener(this);
          sRec.addItemListener(this);
          sElp.addItemListener(this);
          sFrh.addItemListener(this);
         
          mExit.addActionListener(this);
         
          cBlk.addActionListener(this);
          cBlu.addActionListener(this);
          cRed.addActionListener(this);
          cGrn.addActionListener(this);
          cYlo.addActionListener(this);
         
          addMouseListener(this);
          addMouseMotionListener(this);
     }


     public void actionPerformed(ActionEvent ae)
     {
         
          if(ae.getSource()==mExit)
          {
              dispose(); // for closing the frame
              System.exit(0); // for closing the application
          }
         
          cRed.setEnabled(true);
          cBlk.setEnabled(true);
          cBlu.setEnabled(true);
          cGrn.setEnabled(true);
          cYlo.setEnabled(true);
         
         
          if(ae.getSource()==cBlk)
          {
              cBlk.setEnabled(false);
              drawColor=Color.black;
          }
          else if(ae.getSource()==cBlu)
          {
              cBlu.setEnabled(false);
              drawColor=Color.blue;
          }
          else if(ae.getSource()==cRed)
          {
              cRed.setEnabled(false);
              drawColor=Color.red;
          }
          else if(ae.getSource()==cGrn)
          {
              cGrn.setEnabled(false);
              drawColor=Color.green;
          }
          else if(ae.getSource()==cYlo)
          {
              cYlo.setEnabled(false);
              drawColor=Color.yellow;
          }
         
     }
     public void itemStateChanged(ItemEvent ie)
     {
          sLin.setState(false);
          sRec.setState(false);
          sElp.setState(false);
          sFrh.setState(false);
         
          if(ie.getSource()==sLin)
          {
              sLin.setState(true);
              shp="Line";
          }
          if(ie.getSource()==sRec)
          {
              sRec.setState(true);
              shp="Rectangle";
          }
          if(ie.getSource()==sElp)
          {
              sElp.setState(true);
              shp="Ellipse";
          }
          if(ie.getSource()==sFrh)
          {
              sFrh.setState(true);
              shp="FreeHand";
          }
         
     }
    
    
     public void mouseEntered(MouseEvent me){}
     public void mouseExited(MouseEvent me){}
     public void mouseClicked(MouseEvent me){}
     public void mouseMoved(MouseEvent me){}
     public void mouseReleased(MouseEvent me)
     {
          Graphics g=getGraphics();
          g.setPaintMode();
          g.setColor(drawColor);
         
          if(shp=="Line")
              g.drawLine(ox,oy,px,py);
          else if(shp=="Rectangle")
              g.drawRect(px,py,w,h);
          else if(shp=="Ellipse")
              g.drawOval(px,py,w,h);
         
          Record r=new Record(ox,oy,px,py,w,h,drawColor,shp);
          lst.add(r);
         
          setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
          w=h=0;
     }
     public void mousePressed(MouseEvent me)
     {   
          ox=px=me.getX();
          oy=py=me.getY();
          w=h=0;
          setCursor(Cursor.getPredefinedCursor(Cursor.CROSSHAIR_CURSOR));
     }
     public void mouseDragged(MouseEvent me)
     {
          Graphics g=getGraphics();
          g.setColor(drawColor);
          if(shp=="FreeHand")
              g.setPaintMode();
          else
              g.setXORMode(Color.white);
         
          if(shp=="Line")
              g.drawLine(ox,oy,px,py);
          else if(shp=="Rectangle")
          {   
              g.drawRect(px,py,w,h);
          }
          else if(shp=="Ellipse")
              g.drawOval(px,py,w,h);
         
          px=me.getX();
          py=me.getY();
         
          if(shp=="Line")
              g.drawLine(ox,oy,px,py);
          else if(shp=="FreeHand")
          {
              g.drawLine(ox,oy,px,py);
              ox=px;
              oy=py;
          }
          else if(shp=="Rectangle")
          {   
              w=px-ox;
              h=py-oy;
              if(w<0)
                   w=-w;
              else
                   px=ox;
                  
              if(h<0)
                   h=-h;
              else
                   py=oy;
                  
              g.drawRect(px,py,w,h);
          }
          else if(shp=="Ellipse")
          {   
              w=px-ox;
              h=py-oy;
              if(w<0)
                   w=-w;
              else
                   px=ox;
                  
              if(h<0)
                   h=-h;
              else
                   py=oy;
                  
              g.drawOval(px,py,w,h);
          }
     }
     public void paint(Graphics g)
     {
          for(int i=0;i<lst.size();i++)
          {
              Record r=lst.get(i);
              g.setColor(r.drawColor);
              if(r.shp=="Line")
                   g.drawLine(r.ox,r.oy,r.px,r.py);
              if(r.shp=="Rectangle")
                   g.drawRect(r.px,r.py,r.w,r.h);
              if(r.shp=="Ellipse")
                   g.drawOval(r.px,r.py,r.w,r.h);
          }
             
     }
}

class MyWndAdapter extends WindowAdapter
{
     public void windowClosing(WindowEvent we)
     {
          System.exit(0);
     }
}

public class wndapp3
{
     public static void main(String args[])
     {
          MyFrame mf=new MyFrame();
          mf.setVisible(true);
     }
}

/*
     after minimizing the window and then again maximizing you will find that everything gets cleared.
     this is because the paint method is called when you maximize the window again;
    
     Solution :
    
     we will record all the data related to shape and then again draw all the shapes in a Linked list

*/

No comments:

Post a Comment