Đã không làm điều này trước đây, vì vậy rõ ràng là tôi hút nó. Ở đây 64 pixel xung quanh vị trí chuột hiện tại được rút ra ít lớn hơn trên một hình thức. Vấn đề là, đó là 'loại' để làm chậm, và tôi không biết bắt đầu sửa chữa ở đâu.Java, cách vẽ đồ họa thay đổi liên tục
Bên cạnh đó, tôi đã tạo một chuỗi, liên tục gọi đồ họa cập nhật khi nó kết thúc và một fps nhỏ như văn bản, để hiển thị những thứ được vẽ nhanh như thế nào.
hình ảnh ví dụ: (Hình ảnh là từ chữ 'a' trong Eclipse)
Mã dụ:
@SuppressWarnings("serial")
public static class AwtZoom extends Frame {
private BufferedImage image;
private long timeRef = new Date().getTime();
Robot robot = null;
public AwtZoom() {
super("Image zoom");
setLocation(new Point(640, 0));
setSize(400, 400);
setVisible(true);
final Ticker t = new Ticker();
this.image = (BufferedImage) (this.createImage(320, 330));
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent we) {
t.done();
dispose();
}
});
try {
robot = new Robot();
} catch (AWTException e) {
e.printStackTrace();
}
t.start();
}
private class Ticker extends Thread {
public boolean update = true;
public void done() {
update = false;
}
public void run() {
try {
while (update == true) {
update(getGraphics());
// try {
// Thread.sleep(200);
// } catch (InterruptedException e) {
// e.printStackTrace();
// return;
// }
}
} catch (Exception e) {
update=false;
}
}
}
public void update(Graphics g) {
paint(g);
}
boolean isdone = true;
public void paint(Graphics g) {
if (isdone) {
isdone=false;
int step = 40;
Point p = MouseInfo.getPointerInfo().getLocation();
Graphics2D gc = this.image.createGraphics();
try {
for (int x = 0; x < 8; x++) {
for (int y = 0; y < 8; y++) {
gc.setColor(robot.getPixelColor(p.x - 4 + x, p.y
- 4 + y));
gc.fillOval(x * step, y * step, step - 3, step - 3);
gc.setColor(Color.GRAY);
gc.drawOval(x * step, y * step, step - 3, step - 3);
}
}
} catch (Exception e) {
e.printStackTrace();
}
gc.dispose();
isdone = true;
iter++;
}
g.drawImage(image, 40, 45, this);
g.setColor(Color.black);
StringBuilder sb = new StringBuilder();
sb.append(iter)
.append(" frames in ")
.append((double) (new Date().getTime() - this.timeRef)/1000)
.append("s.");
g.drawString(sb.toString(), 50, 375);
}
int iter = 0;
}
Thay đổi được thực:
* thêm "gc.dispose() ; "
* được thêm vào "isdone", vì vậy không thể gọi lại được nhanh hơn, sau đó cần.
* thêm this link để thrashgod nguồn viết lại
* thêm this link để thrashgod nguồn viết lại 2
tại sao bạn không chỉ vẽ lại khi sự kiện di chuyển chuột xảy ra? –
Tại sao bạn gọi trình thu gom rác trong 'sơn'? –
Thực sự muốn vẽ những gì gần con chuột và muốn nó hoạt động ở bất cứ nơi nào mà chuột (nhanh nhất có thể, ngay cả khi trên video). Vấn đề tôi giả sử bạn tìm thấy là, sự kiện sơn đó cũng có thể được gọi không phải bởi chủ đề t. Tôi nghĩ rằng, nó không phải là một vấn đề, nhưng cố định nó với thêm "isdone" dù sao đi nữa. – Margus