java - Why won't gc.clearRect clear the canvas? -
i have code in mazeui class creates couple of fields in javafx entering height , width of maze generated along button , event button. on clicking generate maze code should generate random maze.
now works fine. line clear canvas after maze first drawn using gc.clearrect(x, y, z, a) doesn't appear work , maze's re-drawn on top of 1 on subsequent clicks:
package dojo.maze.ui; import dojo.maze.generator.mazegenerator; import javafx.application.application; import javafx.event.actionevent; import javafx.event.eventhandler; import javafx.geometry.insets; import javafx.scene.group; import javafx.scene.scene; import javafx.scene.canvas.canvas; import javafx.scene.canvas.graphicscontext; import javafx.scene.control.button; import javafx.scene.control.label; import javafx.scene.control.textfield; import javafx.scene.effect.boxblur; import javafx.scene.layout.gridpane; import javafx.scene.layout.hbox; import javafx.scene.layout.vbox; import javafx.scene.paint.color; import javafx.scene.shape.strokelinecap; import javafx.scene.shape.strokelinejoin; import javafx.stage.stage; public class mazeui extends application { private mazegenerator generator; private integer height = 15; private integer width = 15; @override public void start(stage primarystage) throws exception { primarystage.settitle("dojo: solving maze"); group root = new group(); drawmazeview(root); primarystage.setscene(new scene(root, color.white)); primarystage.show(); } private graphicscontext initialisegraphicscontext(canvas canvas) { graphicscontext gc = canvas.getgraphicscontext2d(); gc.setfill(color.black); gc.fillrect(0,0,600,600); gc.setstroke(color.green); gc.setlinecap( strokelinecap.round ); gc.setlinejoin( strokelinejoin.round ); gc.setlinewidth(3); boxblur blur = new boxblur(); blur.setwidth(1); blur.setheight(1); blur.setiterations(1); gc.seteffect(blur); return gc; } private void drawmazeview(group root) { canvas canvas = new canvas(800, 800); graphicscontext gc = initialisegraphicscontext(canvas); gridpane.setconstraints(canvas, 0, 6); gridpane grid = new gridpane(); grid.setpadding(new insets(10, 10, 10, 10)); grid.setvgap(5); grid.sethgap(5); label heightlabel = new label("height:"); final textfield heighttextfield = new textfield(); hbox hbheight = new hbox(); hbheight.getchildren().addall(heightlabel, heighttextfield); hbheight.setspacing(10); gridpane.setconstraints(hbheight, 0, 0); label widthlabel = new label("label:"); final textfield widthtextfield = new textfield(); hbox hbwidth = new hbox(); hbwidth.getchildren().addall(widthlabel, widthtextfield); hbwidth.setspacing(10); gridpane.setconstraints(hbwidth, 0, 2); vbox fieldsbox = new vbox(); fieldsbox.getchildren().addall(hbheight, hbwidth); // create button allows generate new maze button btn = new button(); btn.settext("generate random maze"); btn.setonaction(new eventhandler<actionevent>() { @override public void handle(actionevent event) { system.out.println("button clicked!"); height = integer.valueof(heighttextfield.gettext()); width = integer.valueof(widthtextfield.gettext()); // clear old maze gc.clearrect(0, 0, canvas.getheight(), canvas.getwidth()); generator = new mazegenerator(height, width); drawmaze(gc); } }); gridpane.setconstraints(btn, 0, 4); grid.getchildren().addall(fieldsbox, btn, canvas); root.getchildren().add(grid); } void drawmaze(graphicscontext gc) { int[][] maze = generator.maze(); int xpos = 20, ypos = 20, length = 40, gap = 10; (int = 0; < width; i++) { xpos = 20; // draw north edge (int j = 0; j < height; j++) { if ((maze[j][i] & 1) == 0) { gc.strokeline(xpos, ypos, xpos + length, ypos); // horizontal } xpos += length + gap; system.out.print((maze[j][i] & 1) == 0 ? "+---" : "+ "); } system.out.println("+"); xpos = 20; // draw west edge (int j = 0; j < height; j++) { if ((maze[j][i] & 8) == 0) { gc.strokeline(xpos, ypos, xpos, ypos + length); // vertical } xpos += length + gap; system.out.print((maze[j][i] & 8) == 0 ? "| " : " "); } gc.strokeline(xpos, ypos, xpos, ypos + length); // vertical system.out.println("|"); ypos += length + gap; } // draw bottom line xpos = 20; // reset x pos western edge (int j = 0; j < height; j++) { gc.strokeline(xpos, ypos, xpos + length, ypos); // horizontal system.out.print("+---"); xpos += length + gap; } system.out.println("+"); } public static void main(string[] args) { launch(args); } }
code mazegenerator:
package dojo.maze.generator; import java.util.arrays; import java.util.collections; /* * recursive backtracking algorithm * shamelessly borrowed ruby @ * http://weblog.jamisbuck.org/2010/12/27/maze-generation-recursive-backtracking */ public class mazegenerator { private final int x; private final int y; private final int[][] maze; public static final int[][] mazeproblemone = new int[][] {{2,5,2,3,7,3,1,6,7,3,3,5,6,3,5},{4,10,3,5,12,6,3,9,10,3,5,12,8,6,13},{12,6,5,12,12,14,3,1,6,3,9,10,3,9,12},{12,12,12,12,12,12,6,3,9,4,6,7,1,6,9},{14,9,10,9,12,12,12,6,5,12,12,10,5,12,4},{12,2,7,5,12,12,10,9,12,10,13,4,10,9,12},{12,6,9,12,12,12,2,5,10,5,10,11,3,3,13},{12,10,5,12,10,11,3,13,4,10,5,6,3,1,12},{12,6,9,10,5,4,6,9,12,6,9,12,6,3,9},{10,9,6,1,12,10,11,3,9,12,6,13,12,2,5},{6,7,9,6,9,6,3,3,3,9,8,12,12,6,13},{8,12,6,9,6,13,6,3,7,3,3,13,12,12,12},{6,9,10,5,12,12,12,4,10,3,5,8,12,12,8},{14,3,5,12,8,12,10,11,3,5,10,5,12,10,5},{10,1,10,11,3,9,2,3,3,11,1,10,11,3,9}}; public static final int[][] mazeproblemtwo = new int[][] {{2,5,6,5,6,3,1,6,3,3,7,5,2,3,5},{4,10,9,12,14,3,3,9,6,5,12,10,3,3,9},{14,3,3,9,8,6,3,5,12,12,10,3,3,3,5},{12,6,3,3,5,12,4,10,9,10,3,3,3,3,13},{12,12,6,5,12,12,10,3,3,3,5,6,3,3,9},{12,10,9,12,10,9,6,5,6,3,13,10,3,3,5},{10,3,5,12,6,5,12,10,9,4,14,3,3,1,12},{4,6,9,12,12,10,9,6,3,11,13,6,3,3,9},{12,12,2,13,14,3,5,8,6,5,8,10,3,3,5},{12,10,3,9,12,4,12,6,9,12,6,5,6,3,9},{14,7,3,1,10,13,12,12,4,12,12,10,9,6,1},{12,10,3,7,1,12,10,11,9,12,12,2,3,11,5},{12,2,5,12,6,9,2,5,6,9,10,3,3,5,12},{10,5,12,12,12,6,3,13,12,6,7,1,6,9,12},{2,11,9,10,11,9,2,9,10,9,10,3,11,3,9}}; public static final int[][] mazeproblemthree = new int[][] {{2,5,2,3,7,3,3,3,5,6,3,1,6,7,1},{4,10,3,5,12,2,5,6,9,10,3,3,9,14,5},{10,7,5,12,10,5,14,9,6,5,6,3,5,12,12},{6,9,8,10,3,9,12,6,13,12,10,5,12,12,12},{12,6,3,7,1,6,9,12,12,10,3,9,12,8,12},{12,12,4,10,5,10,5,8,14,3,5,2,11,3,13},{12,10,13,4,10,5,10,5,10,5,10,5,6,5,12},{14,1,12,10,5,14,1,12,6,9,4,10,9,12,12},{14,5,10,5,12,10,5,12,12,2,15,3,1,12,12},{8,12,6,9,10,5,12,12,10,3,9,6,3,9,12},{6,9,14,3,3,9,12,10,3,3,3,9,4,6,9},{10,5,12,6,3,3,13,6,3,3,1,6,11,9,4},{6,9,12,10,5,6,11,9,6,3,3,9,6,3,13},{14,5,12,4,12,10,1,6,9,6,5,2,13,4,12},{8,10,11,9,10,3,3,11,3,9,10,3,9,10,9}}; public static final int[][] mazeproblemfour = new int[][] {{2,3,3,5,4,6,7,3,3,5,6,5,6,3,5},{6,3,1,12,12,12,10,3,5,10,9,12,10,5,12},{12,6,3,9,14,9,4,6,9,2,3,11,1,12,12},{14,9,2,3,11,5,12,10,3,5,6,3,3,9,12},{10,5,6,5,2,11,11,5,4,12,12,6,7,1,12},{4,10,9,10,3,5,6,9,12,10,9,8,12,6,13},{14,5,4,6,3,9,12,6,11,5,6,3,9,12,8},{12,10,9,12,4,6,9,10,5,12,14,3,5,10,5},{12,6,5,12,12,12,6,3,9,12,8,6,13,4,12},{14,9,10,9,12,12,10,3,5,10,5,12,10,13,12},{12,2,7,5,10,11,3,3,9,6,9,12,2,9,12},{10,3,9,10,3,3,5,4,6,11,3,9,6,3,13},{6,5,6,7,3,5,12,10,9,6,3,3,9,6,9},{12,10,9,10,5,8,12,6,5,10,5,6,5,10,5},{10,3,3,1,10,3,11,9,10,3,9,8,10,3,9}}; public static final int[][] mazeproblemfive = new int[][] {{2,3,5,6,3,3,7,5,6,3,3,3,7,3,5},{6,5,12,12,6,3,9,8,10,5,4,6,9,4,12},{12,12,12,12,10,3,5,6,5,10,13,10,5,14,9},{12,10,9,10,5,4,10,9,14,1,12,4,12,10,5},{10,5,6,5,10,15,3,1,14,5,14,9,10,5,8},{6,9,12,10,5,8,6,5,8,10,9,6,5,14,5},{10,3,9,4,12,6,9,10,3,3,3,9,12,8,12},{6,3,7,13,12,10,7,5,2,7,7,1,10,3,13},{14,1,12,8,10,5,12,12,6,9,12,6,3,3,9},{8,6,13,6,3,9,12,12,12,2,13,12,6,3,5},{6,9,8,12,4,6,9,12,14,5,8,10,9,4,12},{12,6,3,9,10,9,6,9,8,10,7,5,6,11,9},{12,10,3,3,3,5,14,3,3,5,12,12,10,5,4},{14,1,6,5,6,9,10,3,1,12,12,10,1,10,13},{10,3,9,10,11,3,3,3,3,9,10,3,3,3,9}}; public mazegenerator(int x, int y) { this.x = x; this.y = y; maze = new int[this.x][this.y]; generatemaze(0, 0); } public void display() { (int = 0; < y; i++) { // draw bbc.north edge (int j = 0; j < x; j++) { system.out.print((maze[j][i] & 1) == 0 ? "+---" : "+ "); } system.out.println("+"); // draw west edge (int j = 0; j < x; j++) { system.out.print((maze[j][i] & 8) == 0 ? "| " : " "); } system.out.println("|"); } // draw bottom line (int j = 0; j < x; j++) { system.out.print("+---"); } system.out.println("+"); } private void generatemaze(int cx, int cy) { dir[] dirs = dir.values(); collections.shuffle(arrays.aslist(dirs)); (dir dir : dirs) { int nx = cx + dir.dx; int ny = cy + dir.dy; if (between(nx, x) && between(ny, y) && (maze[nx][ny] == 0)) { maze[cx][cy] |= dir.bit; maze[nx][ny] |= dir.opposite.bit; generatemaze(nx, ny); } } } private static boolean between(int v, int upper) { return (v >= 0) && (v < upper); } public int[][] maze() { return maze; } private enum dir { n(1, 0, -1), s(2, 0, 1), e(4, 1, 0), w(8, -1, 0); private final int bit; private final int dx; private final int dy; private dir opposite; // use static initializer resolve forward references static { n.opposite = s; s.opposite = n; e.opposite = w; w.opposite = e; } private dir(int bit, int dx, int dy) { this.bit = bit; this.dx = dx; this.dy = dy; } }; public static void main(string[] args) { int x = args.length >= 1 ? (integer.parseint(args[0])) : 8; int y = args.length == 2 ? (integer.parseint(args[1])) : 8; mazegenerator maze = new mazegenerator(x, y); maze.display(); } }
how fix code correctly clears maze after each button click? missing something?
remove boxblur effect before clear canvas, re-apply it. clearing canvas paints transparent color. boxblur effect affect too.
and jewelsea said. you'd have found if you'd reduced code minimum ;-)
Comments
Post a Comment