[Java] Odbieranie zdarzeń w pętli.
Ostatnio zmodyfikowano 2012-04-03 19:53
akwes Temat założony przez niniejszego użytkownika |
[Java] Odbieranie zdarzeń w pętli. » 2012-04-01 21:44:49 Eh... pisanie w Javie to zupełnie inna bajka niż w C++... public void paint( Graphics g ) { while( AppOn ) { } }
Jeżeli pozwolę funkcji paint się wykonywać tyle razy ile chce to niezależnie od podwójnego buforowania wszystko miga jak chore. Dlatego postanowiłem, zabronić temu cudeńku wychodzić poza pętle. stąd też standardowe public void mouseClicked( MouseEvent e ) { }
Nigdy się nie wykona. Mam już timer w osobnym wątku (tak przynajmniej sugeruje nazwa klasy, która to obsługuje). To samo zrobić z kliknięciem? Jakieś inne pomysły? |
|
DejaVu |
» 2012-04-02 00:22:24 Ja bym raczej dociekał przyczyny aniżeli robił na to wytrychy. |
|
m4tx |
» 2012-04-02 06:17:17 Tak. Wywal pętlę z paint()... |
|
akwes Temat założony przez niniejszego użytkownika |
» 2012-04-03 18:14:30 @m4tx, ale bez tej pętli wszystko miga :) Nawet z podwójnym buforowaniem. |
|
DejaVu |
» 2012-04-03 18:16:31 To znaczy, że źle coś napisałeś. |
|
akwes Temat założony przez niniejszego użytkownika |
» 2012-04-03 19:53:29 @up możliwe, jednak miganie raz występuje, raz nie. Jeżeli długo nie ma migania to po prostu jeszcze raz odpalam applet i miganie się pojawia. Na jeden obieg zmiany nieba czasami mignie kilka razy pod rząd (taką seryjką), raz mignie pojedynczo a jeszcze innym razem wcale. import java.applet.Applet; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.event.MouseEvent; import java.awt.event.MouseListener;
public class MyApplet extends Applet implements Runnable, MouseListener { public class Sky { public int R, G, B; Sky() { R = 255; G = 0; B = 0; } public void Update() { if( --R == 0 ) R = 255; } public void PaintSky( int w, int h, Graphics2D g2 ) { g2.setColor( new Color( R, G, B ) ); g2.fillRect( 0, 0, w, h ); } } private Thread Clock; private Graphics Buffer; private Image Screen; private Sky sky; public void update() { sky.Update(); } public void init() { this.setSize( 450, 500 ); Clock = new Thread( this ); addMouseListener( this ); Screen = createImage( this.getWidth(), this.getHeight() ); Buffer = Screen.getGraphics(); sky = new Sky(); Clock.start(); } public void paint( Graphics g ) { Graphics2D g2 =( Graphics2D ) Buffer; sky.PaintSky( 450, 500, g2 ); g.drawImage( Screen, 0, 0, this ); } public void start() { Clock.resume(); } public void stop() { Clock.suspend(); } public void destroy() { Clock.stop(); } public void run() { while( true ) { try { Thread.sleep( 25 ); } catch( InterruptedException e ) { } update(); repaint(); } } public void mouseClicked( MouseEvent e ) { } public void mouseEntered( MouseEvent e ) { } public void mouseExited( MouseEvent e ) { } public void mousePressed( MouseEvent e ) { } public void mouseReleased( MouseEvent e ) { } }
Na Javie się nie znam, pewnie to widać po kodzie. Jeżeli chodzi o timery opierałem się o: http://www.java.happycodings.com/Java_Applets/code14.htmlhttp://www.roseindia.net/java/example/java/applet/ClockApplet.shtmlA jeżeli o buforowanie to na: http://www.realapplets.com/tutorial/DoubleBuffering.html |
|
« 1 » |