Javafx画布仅绘制移动对象而不重绘背景

时间:2014-07-19 11:59:00

标签: javafx

我在JavaFx Canvas中绘制程序绘制了许多不同的形状,其中一个代表一个位置标记(Oval),在某些情况下它的位置必须每1秒更新一次,这可以删除几个标记我必须再次重绘,这减缓了程序的问题我怎么能只重绘当前标记去除其痕迹而不绘制所有形状?很像swing repaint()。

import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;



public class  DrawChart    { 

private Timeline timelinePosition;
private Canvas canvas;
private GraphicsContex graphicsContex;



public void start()  {

  canvas = new Canvas();
  graphicsContex = canvas.getGraphicsContext2D();
  drawManyShapes();
  drawPositionMarker();
  someStateMonitor();

}

public void drawManyShapes()  {


     draw many shapes .......
}

public void drawPositionMarker()  {


        EventHandler eventHandler = new EventHandler<ActionEvent>() {
            public void handle(ActionEvent t) {

                graphicsContex.strokeOval(posi_x , posi_y,  width , hight );    



            }
        };

        Duration duration = Duration.millis(1000);

        timelinePosition = new Timeline();
        timelinePosition.setDelay(duration);
        timelinePosition.setCycleCount(Timeline.INDEFINITE);
        KeyFrame keyPosition = new KeyFrame(duration, drawPosition , null, null);
        timelinePosition.getKeyFrames().add(keyPosition);



    }


public void someStateMonitor()  {

  if(state == true) timelinePosition.play();
  if(state == false) timelinePosition.stop();


}


    }

2 个答案:

答案 0 :(得分:2)

您可以添加画布层。或者你可以在你的形状下保存一个矩形,然后重绘它。

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.stage.Stage;

public class LayeredCanvas extends Application {

    @Override
    public void start(Stage primaryStage) {
        Canvas layer1 = new Canvas(700, 300);
        Canvas layer2 = new Canvas(700, 300);
        GraphicsContext gc1 = layer1.getGraphicsContext2D();
        GraphicsContext gc2 = layer2.getGraphicsContext2D();

        gc1.setFill(Color.GREEN);
        gc1.setFont(new Font("Comic sans MS", 100));
        gc1.fillText("BACKGROUND", 0, 100);
        gc1.fillText("LAYER", 0, 200);
        gc1.setFont(new Font(30));
        gc1.setFill(Color.RED);
        gc1.fillText("Hold a key", 0, 270);

        gc2.setFill(Color.BLUE);
        Pane root = new Pane(layer1, layer2);
        Scene scene = new Scene(root);

        primaryStage.setScene(scene);
        primaryStage.show();

        scene.setOnKeyPressed((evt) -> {
            gc2.clearRect(0, 0, layer2.getWidth(), layer2.getHeight());
            gc2.fillOval(Math.random() * layer2.getWidth(), Math.random() * layer2.getHeight(), 20, 30);
        });
    }

    public static void main(String[] args) {
        launch(args);
    }

}

答案 1 :(得分:0)

我也遇到过这个问题(对于我来说是矩形)而且我做了一个矩形类,你可以使用椭圆形。这个例子只是为了给你一个想法

class Rectangle {
//x position
int x;
//y position
int y;
//size for width
int xSize;
//size for height
int ySize;
//to draw on the canvas
GraphicsContext graphics;

//used to create a rectangle object
public Rectangle(GraphicsContext graphics, int x, int y, int xSize, int ySize) {
    //sets fields used for the rectangle
    this.x = x;
    this.y = y;
    this.xSize = xSize;
    this.ySize = ySize;
    this.graphics = graphics;

        graphics.fillRect(x, y, xSize, ySize);
}

    //used to get rid of rectangles
public void delete(Rectangle rectangle) {
    //erase the rectangle
    (rectangle.graphics).clearRect(rectangle.x, rectangle.y, rectangle.xSize, rectangle.ySize);

    //erase its fields
    rectangle.x = -1;
    rectangle.y = -1;
    rectangle.xSize = -1;
    rectangle.ySize = -1;
}

//will redraw the rectangle
public void reDraw(Rectangle rectangle) {
    (rectangle.graphics).fillRect(rectangle.x, rectangle.y, rectangle.xSize, rectangle.ySize);
}

//will move the rectangle
public void move(Rectangle rectangle, int x, int y) {
    (rectangle.graphics).clearRect(rectangle.x, rectangle.y, rectangle.xSize+1, rectangle.ySize+1);

        (rectangle.graphics).fillRect(x, y, rectangle.xSize, rectangle.ySize);
    }
    //redifine the fields
    this.x = x;
    this.y = y; } }

您也可以添加其他字段。