Tuesday, 15 April 2014

java - Applet flickering -



java - Applet flickering -

i know lot of people had same problem me, can't seem able prepare applet looking @ solutions. should utilize japplet, jframes , jpanel project want project first applet before move on using japplet(i want see difference between two). please @ paint method , see why flickers? can't seem able double buffer it.

import java.applet.*; import java.awt.*; import java.awt.event.*; import java.net.*; public class main extends applet implements runnable, keylistener { private ninja ninja; private image character; private url base; @override public void init() { setsize(800, 480); setbackground(color.white); setfocusable(true); frame frame = (frame) this.getparent().getparent(); frame.settitle("ninjagirl"); addkeylistener(this); seek { base of operations = getdocumentbase(); } grab (exception e) { } character = getimage(base, "data/frontstanding.png"); super.init(); } @override public void start() { ninja = new ninja(); thread thread = new thread(this); thread.start(); super.start(); } @override public void stop() { super.stop(); } @override public void destroy() { super.destroy(); } @override public void update(graphics g) { super.update(g); } @override public void paint(graphics g) { g.drawimage(character, ninja.getcenterx(), ninja.getcentery(), this); } @override public void run() { while (true) { ninja.update(); repaint(); seek { thread.sleep(17); } grab (interruptedexception e) { e.printstacktrace(); } } } @override public void keypressed(keyevent e) { switch (e.getkeycode()) { case keyevent.vk_up: ninja.moveup(); system.out.println("up key pressed"); break; case keyevent.vk_down: ninja.movedown(); break; case keyevent.vk_right: ninja.moveright(); break; case keyevent.vk_left: ninja.moveleft(); break; } } @override public void keyreleased(keyevent e) { switch (e.getkeycode()) { case keyevent.vk_up: ninja.stop(); break; case keyevent.vk_down: ninja.stop(); break; case keyevent.vk_right: ninja.stop(); break; case keyevent.vk_left: ninja.stop(); break; } } @override public void keytyped(keyevent arg0) { } }

you're primary problem here...

@override public void update(graphics g) { super.update(g); } @override public void paint(graphics g) { g.drawimage(character, ninja.getcenterx(), ninja.getcentery(), this); }

applet (and top level containers) not double buffered, means, drawing straight onto screen device. of these functions can slow (flood fill example) which, if done fast enough, can cause flickering.

instead, need implement own double buffering process

@override public void update(graphics g) { graphicsconfiguration gc = graphicsenvironment.getlocalgraphicsenvironment().getdefaultscreendevice().getdefaultconfiguration(); bufferedimage image = gc.createcompatibleimage(getwidth(), getheight(), transparency.opaque); graphics2d g2d = image.getgraphics(); super.update(g2d); g2d.dispose(); g.drawimage(image, 0, 0, this); } @override public void paint(graphics g) { g.drawimage(character, ninja.getcenterx(), ninja.getcentery(), this); }

now, having said that, applet on 15 years out of date , replaced japplet , swing api.

instead, should start creating ui on jpanel , override it's paintcomponent method , custom painting there.

swing components double buffered default, don't need go trouble...unless really, want to

you can add together whatever top level container jframe, jwindow, jdialog, japplet

take @ performing custom painting more details

java applet

No comments:

Post a Comment