Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[Java] Odbieranie zdarzeń w pętli.

Ostatnio zmodyfikowano 2012-04-03 19:53
Autor Wiadomość
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++...

C/C++
public void paint( Graphics g )
{
   
    while( AppOn )
    {
        // tu potrzebuję sprawdzić czy zaszło kliknięcie i pobrać jego x oraz y
        // główna pętla która rysuje sobie
    }
   
}

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
C/C++
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?
P-53700
DejaVu
» 2012-04-02 00:22:24
Ja bym raczej dociekał przyczyny aniżeli robił na to wytrychy.
P-53708
m4tx
» 2012-04-02 06:17:17
Jakieś inne pomysły?
Tak. Wywal pętlę z paint()...
P-53710
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.
P-53800
DejaVu
» 2012-04-03 18:16:31
To znaczy, że źle coś napisałeś.
P-53801
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.

C/C++
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
{
    // Obikety własne a Applecie
    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 );
        }
    }
   
    // Timer
    private Thread Clock;
   
    // DoubleBuffering
    private Graphics Buffer;
    private Image Screen;
    private Sky sky;
   
    public void update()
    {
        /* Aktualizacja fizyki appletu  */
        sky.Update();
    }
   
    // Nadpisane funkcje dotyczące Appletu
    public void init()
    {
        /* Inicjalizacja appletu */
        this.setSize( 450, 500 );
       
        // Timer
        Clock = new Thread( this );
       
        // Zdarzenia myszy
        addMouseListener( this );
       
        // DoubleBuffering
        Screen = createImage( this.getWidth(), this.getHeight() );
        Buffer = Screen.getGraphics();
       
        // Własne klasy
        sky = new Sky();
       
        // Start zegara
        Clock.start();
    }
   
    public void paint( Graphics g )
    {
        /* Rysowanie */
        Graphics2D g2 =( Graphics2D ) Buffer;
        sky.PaintSky( 450, 500, g2 );
       
        // Przeniesienie buforu
        g.drawImage( Screen, 0, 0, this );
    }
   
    public void start()
    {
        Clock.resume();
    }
    public void stop()
    {
        Clock.suspend();
    }
    public void destroy()
    {
        Clock.stop();
    }
   
    // Nadpisane funkcje dotyczące wątku
    public void run()
    {
        while( true )
        {
            try
            {
                Thread.sleep( 25 );
            }
            catch( InterruptedException e )
            {
               
            }
            update();
            repaint();
        }
    }
   
    // Nadpisane funkcje dotyczące zdarzeń myszy
    public void mouseClicked( MouseEvent e )
    {
        /* Zdarzenie po kliknięciu myszką  */
    }
    // Obowiązkowe metody
    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.html
http://www.roseindia.net/java/example/java/applet/ClockApplet.shtml
A jeżeli o buforowanie to na:
http://www.realapplets.com/tutorial/DoubleBuffering.html
P-53803
« 1 »
  Strona 1 z 1