Jump to content

Witaj!

Zaloguj lub Zarejestruj się aby uzyskać pełny dostęp do forum.

Photo
- - - - -

[JAVA] Thread.pause();


  • Please log in to reply
5 replies to this topic

#1 jotu

jotu
  • 15 posts

Posted 12 April 2010 - 23:03

Witam!

Uczę się programować Javy. Mam Macbooka i iMaca. Na obu tych urządzeniach wystepuje ten sam problem. Na PC wszystko działa tak jak powinno.

Problem jest związany z funkcją pause. Podaje przykład programu w Javie:

main.java
import java.awt.*;
public class main
extends Frame {
	public static void main (String[] args) {
		new main();
	}
	public main () {
		setSize (640,480);
		setVisible (true);
	}
	public void paint (Graphics g) {
		g.fillOval (150,150,100,100);
		try {
			Thread.sleep (1000);
		}catch(Exception ex) {}
		g.fillOval (50,50,100,100);
	}
}

Program powinien narysować kóleczko, odczekać jedną sekundę, a później narysować drugie kółeczko. Taki jest cel i tak działa na PC. Niestety na Macu jest tak, że najpierw uruchamia się program, czeka sekundę, po czym pojawiają się dwa kółka.

Nie wiem co robię źle. Program poprawnie się kompiluje. Poprawnie chodzi na Windowsie. Czy coś trzeba skonfigurować na OS X? Bardzo proszę o pomoc.

Pozdrawiam

#2 Krzema

Krzema
  • 190 posts
  • SkądGdańsk, PL

Posted 13 April 2010 - 19:58

W jakim środowisku programujesz i w czym uruchamiasz aplet?
Co do kwestii związanych OS X niestety nie pomogę, bo sam na nim nie pracuję. Mogę powiedzieć jedynie tyle, że podobną sytuację miałem w przypadku JavyScript na iPhonie. Wiem, że to zupełnie co innego, ale widocznie w obu tych środowiskach odświeżanie ekranu następuje dopiero po wykonaniu całego kodu (w tym wypadku funkcji paint()).
Możesz spróbować wstawić repaint(); po narysowaniu każdego kółka, ale to tylko półśrodek - musi istnieć coś co wykona kod poprawnie na MacOSiksie ;)

Pozdrawiam.

#3 jotu

jotu
  • 15 posts

Posted 13 April 2010 - 20:41

Środowisko?
Nie korzystam ani z NetBeans, ani z Eclipse. Tylko terminal. VIM, kompilator javac. Applet uruchamiam również z terminala komendą java.

Co do repainta to nie chce go stosować. Podany program był tylko przykładem co nie działa. Robię już trochę bardziej zaawansowane rzeczy.

Pozdrawiam

#4 jackeill

jackeill
  • 640 posts
  • SkądWroclaw

Posted 13 April 2010 - 21:05

Po 1, uzywasz sleep nie tworzac watku. Nieladnie tak robic. Elegancko byloby stworzyc wlasny watek do tego rysowania.

Po 2, nadpisujesz metode paint() ramki, ktora jest wywolywana wiele razy, system sam w sobie wymusza jej wykonanie, np przy zmianie rozmiaru okna, minimalizacji, etc. Nie mozesz tak robic.

import java.awt.*;
public class Main
extends Frame {

        private int x = 0;

	public static void main (String[] args) {
		new Main();
	}
	public Main () {
		//setSize (640,480);
		setVisible (true);
	}
	public void paint (Graphics g) {
                x++;
		g.fillOval (150,150,100,100);
		try {
			Thread.sleep(4000);
		}catch(Exception ex) {}
		g.fillOval (250,50,100,100);
                System.out.println(x);
	}
}

Uruchom sobie takie cos i zobacz, jak (i kiedy) Ci sie zmienia X. Juz na starcie aplikacji okazuje sie, ze metoda paint() byla wywolana 2 razy. A ze na windowsie dziala? Coz, kazdy system wysyla do aplikacji inne bodzce. Wszystko by bylo ok, gdybys zaprogramowal to od poczatku dobrze ;).

#5 jotu

jotu
  • 15 posts

Posted 13 April 2010 - 22:25

Witaj!

Dzięki za odpowiedź. Poprawiłem kod i teraz wszystko działa bez problemów.

import java.awt.*;
public class Main
extends Frame {
	
	private int d=0;
	
	public static void main (String[] args) {
		new Main();
	}
	
	public Main(){
		setSize(800, 800);
		setVisible(true);
		new Thread(){
			public void run(){
				while(d<=800){
					try{
						paint(getGraphics());
						d+=40;
						Thread.sleep(100);
					}catch(Exception e){}
				}
			}
		}.start();		
	}
	
	public void paint (Graphics g) {
		g.fillOval (d,d,40,40);
	}
}

Pozdrawiam

#6 jackeill

jackeill
  • 640 posts
  • SkądWroclaw

Posted 13 April 2010 - 22:56

Ale nadal zupelnie niepotrzebnie nadpisujesz metode paint().

zamiast:
try{
						paint(getGraphics());
						d+=40;
						Thread.sleep(100);
					}catch(Exception e){}

mozesz przeciez zrobic tak:
try{
						getGraphics().fillOval (d,d,40,40);
						d+=40;
						Thread.sleep(100);
					}catch(Exception e){}





1 user(s) are reading this topic

0 members, 1 guests, 0 anonymous users