graphics - Adding clear and undo Jbutton to java Drawing Program -


i have hit a snag project. using code received previous question have reproduced problem. need add clear , undo jbutton. can see have added buttons hpwever cannot preform desired actions. have tried adding actionlisteners class buttons created , tried itemsdrawn = new arraylist<>; ( clear ) itemsdrawn.remove(itemsdrawn.size()-1) ( undo ) resulting actions program locks up.

basically doing right / put actionlisteners?

any appreciated

import java.awt.basicstroke; import java.awt.borderlayout; import java.awt.color; import java.awt.cursor; import java.awt.dimension; import java.awt.eventqueue; import java.awt.graphics; import java.awt.graphics2d; import java.awt.gridbagconstraints; import java.awt.gridbaglayout; import java.awt.lineargradientpaint; import java.awt.point; import java.awt.rectangle; import java.awt.shape; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.mouseadapter; import java.awt.event.mouseevent; import java.awt.geom.ellipse2d; import java.awt.geom.point2d; import java.awt.geom.line2d; import java.util.arraylist; import java.util.list; import javax.swing.jcheckbox; import javax.swing.jcolorchooser; import javax.swing.jcombobox; import javax.swing.jcomponent; import javax.swing.jfilechooser; import javax.swing.jframe; import javax.swing.jlabel; import javax.swing.jpanel; import javax.swing.jbutton; import javax.swing.jtextfield; import javax.swing.uimanager; import javax.swing.unsupportedlookandfeelexception; import javax.swing.border.compoundborder; import javax.swing.border.emptyborder; import javax.swing.border.lineborder;  public class mypaint {      static arraylist<drawable> itemsdrawn;     static jbutton clear,undo;      public static void main(string[] args) {         new mypaint();     }      public mypaint() {         eventqueue.invokelater(new runnable() {             @override             public void run() {                 try {                     uimanager.setlookandfeel(uimanager.getsystemlookandfeelclassname());                 } catch (classnotfoundexception | instantiationexception | illegalaccessexception | unsupportedlookandfeelexception ex) {                 }                  jframe frame = new jframe("java 2d drawing");                 frame.setdefaultcloseoperation(jframe.exit_on_close);                 frame.setlayout(new borderlayout());                  drawablepane dp = new drawablepane();                 controlpane cp = new controlpane(dp);                  frame.add(dp);                 frame.add(cp, borderlayout.north);                  frame.pack();                 frame.setlocationrelativeto(null);                 frame.setvisible(true);             }         });     }      public class state {          private final color foreground;         private final color background;         private final boolean gradient;         private final boolean filled;         private final boolean dashed;         private int linewidth, dashlength;          public state(color foreground, color background, boolean gradient, boolean filled, boolean dashed,int linewidth, int dashlength) {             this.foreground = foreground;             this.background = background;             this.gradient = gradient;             this.filled = filled;             this.dashed = dashed;             this.linewidth = linewidth;             this.dashlength = dashlength;          }          public color getbackground() {             return background;         }          public color getforeground() {             return foreground;         }          public boolean isgradient() {             return gradient;         }         public boolean isfilled() {             return filled;         }         public boolean isdashed(){             return dashed;         }         public int getlinewidth(){                 return linewidth;         }         public int getdashlength(){             return dashlength;         }      }      public class controlpane extends jpanel {          private jcombobox shapes;         private jlabel foreground;         private jlabel background;         private jcheckbox gradient,filled,dashed;         private jtextfield dashlength,linewidth;         private jlabel len,wid;           private drawablepane drawablepane;          public controlpane(drawablepane pane) {              shapes = new jcombobox<>(new string[]{"rectangle", "oval","line"});             foreground = createcolorlable(color.black);             foreground.settooltiptext("foreground");             background = createcolorlable(color.white);             background.settooltiptext("background");             gradient = new jcheckbox("gradient");             filled = new jcheckbox("filled");             dashed = new jcheckbox("dashed");             dashlength = new jtextfield("1");             linewidth = new jtextfield("1");             len = new jlabel("dash length:");             wid = new jlabel("line width:");             clear = new jbutton("clear");             undo = new jbutton("undo");                   jpanel panel = new jpanel();             panel.add(clear);             panel.add(undo);             panel.add(foreground);             panel.add(background);             panel.add(filled);              setlayout(new gridbaglayout());             gridbagconstraints gbc = new gridbagconstraints();             gbc.gridwidth = gridbagconstraints.remainder;             gbc.fill = gridbagconstraints.horizontal;             gbc.weightx = 1;              add(shapes, gbc);             add(panel, gbc);             gbc.weighty = 1;             gbc.anchor = gridbagconstraints.north;             add(gradient, gbc);             add(dashed, gbc);             add(len);             add(linewidth);             add(wid);             add(dashlength);                setborder(new compoundborder(new lineborder(color.black), new emptyborder(12, 12, 12, 12)));              this.drawablepane = pane;             mousehandler mousehandler = new mousehandler();             drawablepane.addmouselistener(mousehandler);             drawablepane.addmousemotionlistener(mousehandler);           }                    public int getdash(){                 string length = dashlength.gettext();                 int dash = integer.parseint(length);                 return dash;             }                 public int getline(){                 string lwidth = linewidth.gettext();                 int line = integer.parseint(lwidth);                 return line;                 }          protected drawable createdrawable() {              drawable drawable = null;             state state = new state(foreground.getbackground(), background.getbackground(), gradient.isselected(), filled.isselected(), dashed.isselected(),getline(), getdash());             string selected = (string) shapes.getselecteditem();             if ("rectangle".equalsignorecase(selected)) {                 drawable = new square(state);             } else if ("oval".equalsignorecase(selected)) {                 drawable = new circle(state);             }             else if ("line".equalsignorecase(selected)){                 drawable = new line(state);             }              return drawable;          }          protected jlabel createcolorlable(color base) {             final jlabel label = new jlabel();             label.setbackground(base);             label.setborder(new lineborder(color.black));             label.setpreferredsize(new dimension(25, 25));             label.setcursor(cursor.getpredefinedcursor(cursor.hand_cursor));             label.setopaque(true);             label.addmouselistener(new mouseadapter() {                 @override                 public void mousepressed(mouseevent e) {                     color color = jcolorchooser.showdialog(label, "color", label.getbackground());                     if (color != null) {                         label.setbackground(color);                     }                 }             });             return label;         }          public class mousehandler extends mouseadapter {              private drawable drawable;             private point clickpoint;              @override             public void mousepressed(mouseevent e) {                 drawable = createdrawable();                 drawable.setlocation(e.getpoint());                 drawablepane.adddrawable(drawable);                 clickpoint = e.getpoint();             }              @override             public void mousedragged(mouseevent e) {                 point drag = e.getpoint();                 point start = clickpoint;                  int maxx = math.max(drag.x, start.x);                 int maxy = math.max(drag.y, start.y);                 int minx = math.min(drag.x, start.x);                 int miny = math.min(drag.y, start.y);                  int width = maxx - minx;                 int height = maxy - miny;                  drawable.setlocation(new point(minx, miny));                 drawable.setsize(new dimension(width, height));                  drawablepane.repaint();             }          }      }      public interface drawable {          public void paint(jcomponent parent, graphics2d g2d);          public void setlocation(point location);          public void setsize(dimension size);          public state getstate();          public rectangle getbounds();      }      public abstract class abstractdrawable implements drawable {          private rectangle bounds;         private state state;          public abstractdrawable(state state) {             bounds = new rectangle();             this.state = state;         }          @override         public state getstate() {             return state;         }          public abstract shape getshape();          @override         public void setlocation(point location) {             bounds.setlocation(location);         }          @override         public void setsize(dimension size) {             bounds.setsize(size);         }          @override         public rectangle getbounds() {             return bounds;         }          @override         public void paint(jcomponent parent, graphics2d g2d) {              shape shape = getshape();             state state = getstate();             rectangle bounds = getbounds();             final float dash1[] = {state.linewidth};             final basicstroke dashed =             new basicstroke(state.dashlength,                         basicstroke.cap_butt,                         basicstroke.join_miter,                         10.0f, dash1, 0.0f);              if (bounds.width > 0 && bounds.height > 0) {                  if (state.isgradient()){                      if (state.isdashed()){                      point2d startpoint = new point2d.double(bounds.x, bounds.y);             point2d endpoint = new point2d.double(bounds.x + bounds.width, bounds.y + bounds.height);             lineargradientpaint gp = new lineargradientpaint(                             startpoint,                             endpoint,                             new float[]{0f, 1f},                             new color[]{state.getforeground(), state.getbackground()});                         g2d.setpaint(gp);                     g2d.setstroke(dashed);                     g2d.draw(shape);                 }                      else{             point2d startpoint = new point2d.double(bounds.x, bounds.y);             point2d endpoint = new point2d.double(bounds.x + bounds.width, bounds.y + bounds.height);             lineargradientpaint gp = new lineargradientpaint(                             startpoint,                             endpoint,                             new float[]{0f, 1f},                             new color[]{state.getforeground(), state.getbackground()});                      g2d.setpaint(gp);                      g2d.fill(shape);                      }                  }              else if (state.isfilled()){                 if (bounds.width > 0 && bounds.height > 0) {                  g2d.setpaint(state.getforeground());                 g2d.fill(shape);                   }                 }             else if(state.isdashed()){                 g2d.setstroke(dashed);                 g2d.setpaint(state.getforeground());                 g2d.draw(shape);              }              else{                  basicstroke stroke = new basicstroke();                  g2d.setstroke(stroke);                 g2d.setpaint(state.getforeground());                 g2d.draw(shape);             }         }         }         }       public class square extends abstractdrawable {          public square(state state) {             super(state);         }          @override         public shape getshape() {             return getbounds();         }      }      public class circle extends abstractdrawable {          public circle(state state) {             super(state);         }          @override         public shape getshape() {             rectangle bounds = getbounds();             return new ellipse2d.float(bounds.x, bounds.y, bounds.width, bounds.height);         }      }      public class line extends abstractdrawable {          public line(state state){             super(state);         }         @override         public shape getshape() {            rectangle bounds = getbounds();            return new line2d.float(bounds.x, bounds.y,bounds.width, bounds.height);          }     }      public class drawablepane extends jpanel {          list<drawable> itemsdrawn;          public drawablepane() {             itemsdrawn =  new arraylist<>();         }          @override         public dimension getpreferredsize() {             return new dimension(200, 200);         }          @override         protected void paintcomponent(graphics g) {             super.paintcomponent(g);             graphics2d g2d = (graphics2d) g.create();             (drawable d : itemsdrawn) {                 d.paint(this, g2d);             }             g2d.dispose();         }          public void adddrawable(drawable drawable) {              itemsdrawn.add(drawable);             repaint();          }                   }            } 

this controlpane class implemented undo , clear buttons

public controlpane(drawablepane pane) {              shapes = new jcombobox<>(new string[]{"rectangle", "oval","line"});             foreground = createcolorlable(color.black);             foreground.settooltiptext("foreground");             background = createcolorlable(color.white);             background.settooltiptext("background");             gradient = new jcheckbox("gradient");             filled = new jcheckbox("filled");             dashed = new jcheckbox("dashed");             dashlength = new jtextfield("1");             linewidth = new jtextfield("1");             len = new jlabel("dash length:");             wid = new jlabel("line width:");             clear = new jbutton("clear");             undo = new jbutton("undo");                   jpanel panel = new jpanel();             panel.add(clear);             panel.add(undo);             panel.add(foreground);             panel.add(background);             panel.add(filled);              setlayout(new gridbaglayout());             gridbagconstraints gbc = new gridbagconstraints();             gbc.gridwidth = gridbagconstraints.remainder;             gbc.fill = gridbagconstraints.horizontal;             gbc.weightx = 1;              add(shapes, gbc);             add(panel, gbc);             gbc.weighty = 1;             gbc.anchor = gridbagconstraints.north;             add(gradient, gbc);             add(dashed, gbc);             add(len);             add(linewidth);             add(wid);             add(dashlength);                setborder(new compoundborder(new lineborder(color.black), new emptyborder(12, 12, 12, 12)));              this.drawablepane = pane;             mousehandler mousehandler = new mousehandler();             drawablepane.addmouselistener(mousehandler);             drawablepane.addmousemotionlistener(mousehandler);              clear.addactionlistener(new actionlistener() {             @override            public void actionperformed(actionevent arg0) {                // todo auto-generated method stub                itemsdrawn = new arraylist<>();                (not sure use here).repaint();            }        });             undo.addactionlistener(new actionlistener() {             @override            public void actionperformed(actionevent arg0) {                // todo auto-generated method stub                if (itemsdrawn.size() != 0) {                    itemsdrawn.remove(itemsdrawn.size() - 1);                    (not sure put here).repaint();                }            }        });          } 

so ( clear , undo methods in drawablepane )

clear.addactionlistner(new actionlistener() {                 @override                 public void actionpreformed(actionevent arg0){                     clear();                 }             });            undo.addactionlistener(new actionlistener() {             @override            public void actionperformed(actionevent arg0) {                // todo auto-generated method stub                undo();            }        }); public class drawablepane extends jpanel {          list<drawable> itemsdrawn;          public drawablepane() {             itemsdrawn =  new arraylist<>();          }         public void undo(){             if (itemsdrawn.size() != 0) {                    itemsdrawn.remove(itemsdrawn.size() - 1);                    repaint();         }         }         public void clear(){              itemsdrawn = new arraylist<>();                repaint();          }         @override         public dimension getpreferredsize() {             return new dimension(200, 200);         }          @override         protected void paintcomponent(graphics g) {             super.paintcomponent(g);             graphics2d g2d = (graphics2d) g.create();             (drawable d : itemsdrawn) {                 d.paint(this, g2d);             }             g2d.dispose();         }          public void adddrawable(drawable drawable) {              itemsdrawn.add(drawable);             repaint();          }                   }            } 

i getting error saying clear , undo cannot found in drawablepane

the main problem itemsdrawn used drawablepane not controlpane, trying change controlpane have no effect on drawablepane.

instead, should add 2 methods drawablepane called, undo , clear, can called actionlisteners in controlpane

updated example

first, add undo , clear method drawablepane...

public class drawablepane extends jpanel {      list<drawable> itemsdrawn;      public drawablepane() {         itemsdrawn = new arraylist<>();     }      @override     public dimension getpreferredsize() {         return new dimension(200, 200);     }      @override     protected void paintcomponent(graphics g) {         super.paintcomponent(g);         graphics2d g2d = (graphics2d) g.create();         (drawable d : itemsdrawn) {             d.paint(this, g2d);         }         g2d.dispose();     }      public void adddrawable(drawable drawable) {          itemsdrawn.add(drawable);         repaint();      }      public void undo() {          if (!itemsdrawn.isempty()) {              int size = itemsdrawn.size() - 1;             itemsdrawn.remove(size);             repaint();          }      }      public void clear() {          itemsdrawn.clear();         repaint();      }  } 

second, call methods appropriate actionlistener...

clear.addactionlistner(new actionlistener() {     @override     public void actionpreformed(actionevent arg0) {         drawablepane.clear();     } });  undo.addactionlistener(new actionlistener() {      @override     public void actionperformed(actionevent arg0) {         drawablepane.undo();     } }); 

these would, obviously, created in controlpane


Comments

Popular posts from this blog

javascript - jquery or ashx not working -

opencv - DataType<cv::detail::deriv_type>::depth what is it used for -

python 3.x - Mapping specific letters onto a list of words -