Odpowiedz na ten temat
Pokaż wyniki od 1 do 6 z 6
  1. Avatar jotu
    Dołączył
    Aug 2008
    Postów
    15

    Cytuj | #1

    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
    Kod:
    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
    PW'44


  2. Avatar Krzema
    Dołączył
    Jul 2008
    Skąd
    Gdańsk, PL
    Postów
    181

    Cytuj | #2

    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. Avatar jotu
    Dołączył
    Aug 2008
    Postów
    15

    Cytuj | #3

    Ś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
    Ostatnio edytowane przez jotu ; 13.04.2010 o 20:49
    PW'44


  4. Dołączył
    Nov 2008
    Skąd
    Wroclaw
    Postów
    640

    Cytuj | #4

    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.

    Kod:
    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. Avatar jotu
    Dołączył
    Aug 2008
    Postów
    15

    Cytuj | #5

    Witaj!

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

    Kod:
    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
    PW'44


  6. Dołączył
    Nov 2008
    Skąd
    Wroclaw
    Postów
    640

    Cytuj | #6

    Ale nadal zupelnie niepotrzebnie nadpisujesz metode paint().

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

Odpowiedz na ten temat