java 图形立即显示_Java,如何绘制不断变化的图形

以下是我的主要重写,并做了以下值得注意的修改:我把检测像素颜色的任务和绘制的任务分开了

我已经替换了robot.getPixelColor(.)与robot.createScreenCapture(.)一次提取全部64个像素,而不是每次一个像素

我介绍了智能裁剪-只需要重绘的是重绘。

我已经设置了线程,所以对模型和视图的所有更新都发生在事件调度线程上

滴答声不断地运行。当它检测到像素颜色的变化(或者由于鼠标移动到不同的区域或鼠标下的像素发生变化)时,它会准确地检测更改的内容,更新模型,然后请求视图重新绘制。这种方法立即更新到人眼。289屏幕更新累计耗时1秒。

对于一个安静的星期六晚上来说,这是一个令人愉快的挑战。import javax.swing.*;import java.awt.*;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;

import java.awt.geom.Ellipse2D;import java.awt.image.BufferedImage;public class ZoomPanel extends JPanel {

private static final int STEP = 40;

private int iter = 0;

private long cumulativeTimeTaken = 0;

public static void main(String[] args) {

final JFrame frame = new JFrame("Image zoom");

final ZoomPanel zoomPanel = new ZoomPanel();

frame.getContentPane().add(zoomPanel);

final Ticker t = new Ticker(zoomPanel);

frame.addWindowListener(new WindowAdapter() {

public void windowClosing(WindowEvent we) {

t.done();

frame.dispose();

}

});

t.start();

frame.setLocation(new Point(640, 0));

frame.pack();

frame.setVisible(true);

}

private final Color[][] model = new Color[8][8];

public ZoomPanel() {

setSize(new Dimension(400, 400));

setMinimumSize(new Dimension(400, 400));

setPreferredSize(new Dimension(400, 400));

setOpaque(true);

}

private void setColorAt(int x, int y, Color pixelColor) {

model[x][y] = pixelColor;

repaint(40 + x * STEP, 45 + y * STEP, 40 + (x * STEP) - 3, 45 + (y * STEP) - 3);

}

private Color getColorAt(int x, int y) {

return model[x][y];

}

public void paintComponent(Graphics g) {

long start = System.currentTimeMillis();

if (!SwingUtilities.isEventDispatchThread()) {

throw new RuntimeException("Repaint attempt is not on event dispatch thread");

}

final Graphics2D g2 = (Graphics2D) g;

g2.setColor(getBackground());

try {

for (int x = 0; x 

for (int y = 0; y 

g2.setColor(model[x][y]);

Ellipse2D e = new Ellipse2D.Double(40 + x * STEP, 45 + y * STEP, STEP - 3, STEP - 3);

g2.fill(e);

g2.setColor(Color.GRAY);

g2.draw(e);

}

}

} catch (Exception e) {

e.printStackTrace();

}

iter++;

g2.setColor(Color.black);

long stop = System.currentTimeMillis();

cumulativeTimeTaken += stop - start;

StringBuilder sb = new StringBuilder();

sb.append(iter)

.append(" frames in ")

.append((double) (cumulativeTimeTaken) / 1000)

.append("s.");

System.out.println(sb);

}

private static class Ticker extends Thread {

private final Robot robot;

public boolean update = true;

private final ZoomPanel view;

public Ticker(ZoomPanel zoomPanel) {

view = zoomPanel;

try {

robot = new Robot();

} catch (AWTException e) {

throw new RuntimeException(e);

}

}

public void done() {

update = false;

}

public void run() {

int runCount = 0;

while (update) {

runCount++;

if (runCount % 100 == 0) {

System.out.println("Ran ticker " + runCount + " times");

}

final Point p = MouseInfo.getPointerInfo().getLocation();

Rectangle rect = new Rectangle(p.x - 4, p.y - 4, 8, 8);

final BufferedImage capture = robot.createScreenCapture(rect);

for (int x = 0; x 

for (int y = 0; y 

final Color pixelColor = new Color(capture.getRGB(x, y));

if (!pixelColor.equals(view.getColorAt(x, y))) {

final int finalX = x;

final int finalY = y;

SwingUtilities.invokeLater(new Runnable() {

public void run() {

view.setColorAt(finalX, finalY, pixelColor);

}

});

}

}

}

}

}

}}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值