इससे पहले ऐसा नहीं किया है, इसलिए जाहिर है कि मैं इसे चूसता हूं। वर्तमान माउस स्थिति के आस-पास 64 पिक्सेल एक फॉर्म पर थोड़ा बड़ा खींचा जाता है। समस्या यह है कि धीमा करने के लिए यह 'तरह का' है, और मुझे नहीं पता कि फिक्सिंग शुरू करना कहां है।जावा, निरंतर बदलते ग्राफिक्स को कैसे आकर्षित करें
इसके अलावा, मैंने एक थ्रेड बनाया है, जो इसे समाप्त होने पर अपडेट ग्राफिक्स को लगातार कॉल करता है और टेक्स्ट की तरह थोड़ा एफपीएस कहता है, वास्तव में यह दिखाने के लिए कि कितनी तेजी से चीजें खींची जाती हैं।
छवि उदाहरण: (छवि पत्र से है 'एक' ग्रहण में)
कोड उदाहरण:
@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;
}
किए गए परिवर्तन:
* "gc.dispose जोड़ा() , "
* जोड़ा गया "आइसडोन", इसलिए रेड्रा को तेज़ नहीं कहा जा सकता है, तो इसे चाहिए।
* this link जोड़ा thrashgod के स्रोत को फिर से लिखने
* जोड़ा this link स्रोत पुनर्लेखन thrashgod करने के लिए 2
माउस मूव इवेंट होने पर आप केवल तब क्यों पेंट नहीं करते हैं? –
आप 'पेंट' के दौरान कचरा कलेक्टर का आह्वान क्यों कर रहे हैं? –
वास्तव में माउस के पास क्या पेंट करना चाहते हैं, और यह काम करना चाहते हैं कि कभी भी माउस (जितना तेज़ हो सके, वीडियो पर भी)। मुझे लगता है कि समस्या आपको मिली थी, कि पेंट इवेंट को थ्रेड टी द्वारा भी नहीं कहा जा सकता था। मुझे लगता है, यह कोई समस्या नहीं थी, लेकिन किसी भी तरह से "isdone" जोड़ने के साथ इसे ठीक किया गया। – Margus