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
Post a Comment