swing - Java painting program: How to leave a trail behind a shape -
hello , thank reading question. beginner @ java program , attempted create program knowledge have @ moment. program trying create painting program, allows move shape , paints shape onto frame. 1 problem have when paint not leave trail. figured not leave trail because overriding paint method , clears previous painted object when want paint new one. when remove code overrides , run program shape leaves trail behind buttons on top of frame messed up.
here code:
package movingblock; import java.awt.borderlayout; import java.awt.color; import java.awt.flowlayout; import java.awt.graphics2d; import java.awt.event.actionevent; import java.awt.event.actionlistener; import java.awt.event.keyevent; import java.awt.event.keylistener; import javax.swing.*; import javax.swing.event.changeevent; import javax.swing.event.changelistener; public class movingblockframe extends jframe implements keylistener, actionlistener, changelistener{ flowlayout flo = new flowlayout(flowlayout.leading, 10, 10); jpanel buttonpanel = new jpanel(); jbutton circle = new jbutton("circle"); jbutton rectangle = new jbutton("rectangle"); jbutton color = new jbutton("color"); jslider speed = new jslider(0, 100, 10); graphics2d test3; int desiredwidth = 780; int desiredheight = 800; movingblockcanvas background = new movingblockcanvas(); int paintspeed = 10; boolean diagonalkeysdown; boolean diagonalkeysup; public movingblockframe(){ settitle("painter"); buttonpanel.setborder(borderfactory.createlineborder(color.black)); setsize(desiredwidth, desiredheight); setdefaultcloseoperation(jframe.exit_on_close); keylistener(); buttonpanel.setlayout(flo); buttonpanel.add(circle); buttonpanel.add(rectangle); buttonpanel.add(color); buttonpanel.add(speed); background.desiredshape = "circle"; background.addkeylistener(this); add(background); add(buttonpanel, borderlayout.north); setvisible(true); } public static void main(string[] args){ movingblockframe frame = new movingblockframe(); frame.addkeylistener(frame); } public void keypressed(keyevent input) { int pressed = input.getkeycode(); if(pressed == 83){ diagonalkeysdown = true; background.xvalue+= paintspeed; background.repaint(); }else if(pressed == 68 && !diagonalkeysdown){ background.yvalue+=paintspeed; background.repaint(); }else if(pressed == 87 ){ diagonalkeysup = true; background.xvalue-=paintspeed; background.repaint(); }else if(pressed == 65 ){ background.yvalue-=paintspeed; background.repaint(); } if(diagonalkeysdown && pressed == 68){ background.yvalue+=paintspeed; background.xvalue+= paintspeed; background.repaint(); } if(diagonalkeysup && pressed == 68){ background.yvalue+=paintspeed; background.xvalue-= paintspeed; background.repaint(); } if(diagonalkeysdown && pressed == 65){ background.yvalue-=paintspeed; background.xvalue+= paintspeed; background.repaint(); } if(diagonalkeysup && pressed == 65){ background.yvalue-=paintspeed; background.xvalue-= paintspeed; background.repaint(); } } public void keyreleased(keyevent input) { int released = input.getkeycode(); if(released == 83){ diagonalkeysdown = false; } if(released == 87){ diagonalkeysup = false; } } public void keytyped(keyevent input) { } public void actionperformed(actionevent event) { string command = event.getactioncommand(); if(command.equals("circle")){ background.desiredshape = "circle"; background.repaint(); }else if (command.equals("rectangle")){ background.desiredshape = "rectangle"; background.repaint(); }else if(command.equals("color")){ //colorsliders test = new colorsliders(); } } public void statechanged(changeevent event) { jslider source = (jslider) event.getsource(); if(source.getvalueisadjusting() != true){ paintspeed = source.getvalue(); } } public void keylistener(){ buttonpanel.addkeylistener(this); circle.addkeylistener(this); rectangle.addkeylistener(this); circle.addactionlistener(this); rectangle.addactionlistener(this); color.addkeylistener(this); color.addactionlistener(this); speed.addkeylistener(this); speed.addchangelistener(this); } } then there class:
package movingblock; import java.awt.graphics; import javax.swing.jpanel; import javax.swing.jpanel; public class movingblockcanvas extends jpanel { int xvalue = 50; int yvalue = 50; string desiredshape; public movingblockcanvas(){ } public void paint(graphics render){ //super.paint(render); render.setcolor(colorpanel.getcolor2()); if(desiredshape == "rectangle"){ render.fillrect(yvalue, xvalue, 50, 50); } if(desiredshape == "circle"){ render.filloval(yvalue, xvalue, 50, 50); } } } this code have far. problem in paint method when override method not leave trail shapes. if have coding tips love hear them. thank in advance.
this learned fix error. had create new buffered image draw image, redraw buffered image using paintcomponent method. class created updated code make program paint , leave trail behind shape while still overriding paintcomponenet method.
public class movingblockcanvas extends jpanel { int xvalue = 50; int yvalue = 50; int width = 10; int height = 10; string desiredshape; bufferedimage drawing; public movingblockcanvas(){ } public void drawshapes(){ if(drawing == null){ createbufferedimage(); } if(desiredshape.equals("rectangle")){ graphics2d g = drawing.creategraphics(); g.setcolor(colorpanel.getcolor2()); g.fillrect(yvalue, xvalue, width, height); g.dispose(); } if(desiredshape.equals("circle")){ graphics2d g = drawing.creategraphics(); g.setcolor(colorpanel.getcolor2()); g.filloval(yvalue, xvalue, width, height); g.dispose(); } repaint(); } public void createbufferedimage() { bufferedimage buffer = new bufferedimage(getwidth(), getheight(), bufferedimage.type_int_rgb); graphics2d g2d = buffer.creategraphics(); g2d.setcolor(color.white); g2d.fillrect(0, 0, getwidth(), getheight()); g2d.dispose(); drawing = buffer; } @override public void paintcomponent(graphics render){ super.paintcomponent(render); graphics2d g = (graphics2d) render.create(); if(drawing == null){ createbufferedimage(); } g.drawimage(drawing, 0, 0, this); g.dispose(); } } thank helped me learn this!
Comments
Post a Comment