Skocz do zawartości

Witaj!

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

Zdjęcie
- - - - -

[JAVA] Thread.pause();


  • Zaloguj się, aby dodać odpowiedź
5 odpowiedzi w tym temacie

#1 jotu

jotu
  • 15 postów

Napisano 12 kwietnia 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 postów
  • SkądGdańsk, PL

Napisano 13 kwietnia 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 postów

Napisano 13 kwietnia 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 postów
  • SkądWroclaw

Napisano 13 kwietnia 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 postów

Napisano 13 kwietnia 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 postów
  • SkądWroclaw

Napisano 13 kwietnia 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){}





Użytkownicy przeglądający ten temat: 1

0 użytkowników, 1 gości, 0 anonimowych