import javafx.animation.AnimationTimer; import javafx.application.Application; import javafx.event.EventHandler; import javafx.scene.Group; import javafx.scene.Scene; import javafx.scene.image.ImageView; import javafx.scene.image.WritableImage; import javafx.scene.input.MouseEvent; import javafx.scene.paint.Color; import javafx.scene.shape.Rectangle; import javafx.stage.Stage; public class TestAlternatingImages extends Application { public static int IMGW = 3; public static int IMGH = 3; public static int ROWS = 150; public static int COLS = 500; public static int SEP = 0; public static int BORDER = 5; Scene scene; Group root; Rectangle bg; ImageView views1[] = new ImageView[ROWS * COLS]; ImageView views2[] = new ImageView[ROWS * COLS]; ImageView viewsall[] = new ImageView[ROWS * COLS * 2]; boolean alternating; int interp(double a, double b, double t) { double v = a + (b-a) * t; return (int) Math.round(v * 255); } int interp(Color a, Color b, double t) { return (0xff << 24 | interp(a.getRed(), b.getRed(), t) << 16 | interp(a.getGreen(), b.getGreen(), t) << 8 | interp(a.getBlue(), b.getBlue(), t)); } @Override public void start(Stage stage) { WritableImage wimg1 = new WritableImage(IMGW, IMGH); WritableImage wimg2 = new WritableImage(IMGW, IMGH); for (int y = 0; y < IMGH; y++) { for (int x = 0; x < IMGW; x++) { double t = Math.sqrt((x * x + y * y) / (double) (IMGW * IMGW + IMGH * IMGH)); wimg1.getPixelWriter().setArgb(x, y, interp(Color.RED, Color.GREEN, t)); wimg2.getPixelWriter().setArgb(x, y, interp(Color.BLUE, Color.YELLOW, t)); } } root = new Group(); bg = new Rectangle(COLS * (IMGW + SEP) + BORDER*2 - SEP, ROWS * 2 * (IMGH + SEP) + BORDER * 3 - SEP*2); System.out.println("dims = "+bg.getWidth()+" x "+bg.getHeight()); root.getChildren().add(bg); double ox1 = BORDER; double oy1 = BORDER; double ox2 = BORDER; double oy2 = BORDER * 2 + ROWS * (IMGH + SEP); for (int r = 0; r < ROWS; r++) { for (int c = 0; c < COLS; c++) { ImageView iv1 = new ImageView(wimg1); iv1.setX(ox1 + c * (IMGW + SEP)); iv1.setY(oy1 + r * (IMGH + SEP)); ImageView iv2 = new ImageView(wimg2); iv2.setX(ox2 + c * (IMGW + SEP)); iv2.setY(oy2 + r * (IMGH + SEP)); int index = r * COLS + c; views1[index] = iv1; views2[index] = iv2; viewsall[index * 2 + 0] = iv1; viewsall[index * 2 + 1] = iv2; } } loadImagesAdjacent(); scene = new Scene(root); stage.setScene(scene); stage.show(); scene.addEventHandler(MouseEvent.MOUSE_PRESSED, new EventHandler() { @Override public void handle(MouseEvent event) { alternating = !alternating; if (alternating) { loadImagesAlternating(); } else { loadImagesAdjacent(); } } }); AnimationTimer timer = new AnimationTimer() { @Override public void handle(long l) { run(); } }; timer.start(); } double hue; long start; int frames; public void run() { hue += 1; if (hue >= 360) hue -= 360; bg.setFill(Color.hsb(hue, 1.0, 1.0)); long now = System.currentTimeMillis(); if (start == 0) { start = now; frames = 0; } else { frames++; double seconds = (now - start) / 1000.0; if (seconds >= 1.0) { System.out.println("FPS: "+(frames / seconds)); start = now; frames = 0; } } } void loadImagesAdjacent() { root.getChildren().clear(); root.getChildren().add(bg); root.getChildren().addAll(views1); root.getChildren().addAll(views2); } void loadImagesAlternating() { root.getChildren().clear(); root.getChildren().add(bg); root.getChildren().addAll(viewsall); } }