aplet, pare pytań

0

Witam
Mam pare pytan zwiazanych z apletami i poposiłbym o odpowiedz:

  1. czy da sie aby nie dalo sie zmieniac w aplecie rozmiaru? jak w JJFrame jest setResizable
  2. w moim aplecie rysuje na panelu ktory jest do apletu dodany. Chcałbym zrobić okno powitalne z paskiem postepu. Mógłby ktoś powiedzieć jak to zrobić można> w aplikacji moglbym zrobic np dodatkowa ramke ktora po okreslonym czasie ustawila by sie na setVisible(false).
  3. dlaczego gdy zmieniam rozmiar apletu to on mruga? korzystam z podwojengo buforowania. Czy dlatego ze rysuje na panelu a nie w aplecie?

pozdrawiam i dziekuje za odpowidzi

0
dafra napisał(a)
  1. czy da sie aby nie dalo sie zmieniac w aplecie rozmiaru? jak w JJFrame jest setResizable

Przecież się nie da... rozmiar apletu ustala się w HTML, użytkownik tego nie może zmienić.

dafra napisał(a)
  1. w moim aplecie rysuje na panelu ktory jest do apletu dodany. Chcałbym zrobić okno powitalne z paskiem postepu. Mógłby ktoś powiedzieć jak to zrobić można> w aplikacji moglbym zrobic np dodatkowa ramke ktora po okreslonym czasie ustawila by sie na setVisible(false).

Do zmieniania pomiędzy 'stanami' użyłbym CardLayout, zamiast usuwać i dodawać panele...

Ale jeśli chodzi o wczytywanie, to i tak twoje okienko nie pokaża się dopóki cały jar nie zostanie wczytany...
Można oczywiście deploynąć applet przez jnpl, podając osobny jar jako resources i wtedy jakoś da się zrobić pasek postępu (w końcu sam kod ściągnie się szybciutko)
Nigdy sam tego nie próbowałem w ten sposób, ale możesz spróbować.
http://docs.oracle.com/javase/tutorial/deployment/applet/customProgressIndicatorForApplet.html

dafra napisał(a)
  1. dlaczego gdy zmieniam rozmiar apletu to on mruga? korzystam z podwojengo buforowania. Czy dlatego ze rysuje na panelu a nie w aplecie?

Korzystasz z JApplet czy Applet?

0

dziękuję Ci bardzo za odpowiedz. Co do 1 pytania to na razie nie wrzucam tego na strone tylko przy uruchomieniu z Eclipsa, więc tego sie nie da?
3. korzystam z JApplet

mam jeszcze jedno pytanie - otóż gdy uruchomie aplet panel jest jakby przesunięty w prawo i w dół że u góry i z lewej strony panelu mam pustkę, gdy tylko spróbuje zwiększyć czy zmiejszyć myszką wielkość okienka z apletem panel pojawia się tam gdzie ma być? Wiesz co moze byc nie tak? Powinienem zarzucić kod lecz chwilowo nie ma mnie na moim komputerze.

Dziękuję raz jeszcze za odpowiedzi i pomoc
Pozdrawiam

0

ad1) Panel domyślnie ma stały rozmiar ustawiony w html. Natomiast sam aplet może zażądać od przeglądarki (lub applet viewera - dokładnie od kontrolera sandboxa) zmiany swojego rozmiaru. Zmiana taka może zostać przeprowadzona lub żądanie może zostać odrzucone. W ten sposób użytkownik może teoretycznie sam kontrolować rozmiar apletu. Na przykład aplet na swoich granicach może zmieniać kursor myszy na strzałki, użytkownik może "przesunąć" krawędź i może to pójść z apletu jako żądanie zmiany rozmiaru - podobnie jak zmienia się rozmiar okienka). Jaki tego będzie efekt i czy strona się wtedy nie rozsypie - to zależy od wielu rzeczy - w tym od przeglądarki.

ad2) Jeżeli wykombinowałeś aplet, który jest tak kosmicznie czasochłonny, że lepiej aby się ładował etapami, to najprościej zrobić aplet, na który będzie składał się z panel a z jakimś paskiem postępu, albo inna graficzką gdy w tym czasie aplet może robić coś czasochłonnego (na przykład ładować kolejne klasy/dane itp. cuda na kiju). Na koniec z JAppletu puszczasz remove oraz add na nowy utworzony w międzyczasie panel i zwykle to działa. Równie dobrze aplet może sobie otworzyć nowe okno top-level, aby nie być uwiązanym do okna w przeglądarce, albo wręcz może się przełączyć na tryb fullscreen, o ile nie zatrzyma mu tego security manager. Tak robią niektóre gry (wiele z takich było na kórniku).

ad3) Aplet Ci mruga ponieważ tło apletu jest zawsze domyślnie mazane przez clearRect przy każdej zmianie rozmiaru - czy Ci się to podoba czy nie. Podobno można temu zaradzić przez przejęcie kontroli nad myszą i podczas wleczenia myszą krawędzi zmianę zawartości wywoływanej przez paint tak aby nie wywoływać super.paint, a rysować jedynie ramkę w trybie xor (tak jak na starym Windows 95). Ewentualnie można spróbować przedefiniować metodę clearRect, tak aby przestawała działać kiedy się tego życzy.

Trochę rozwinąłem post Keraia. :)

Co do ostatniego pytania, to pokaż Twój kod dla tego apletu w html. Rozmieszczenie apletu na stronie jest też silnie uzależnione od typu przeglądarki (i wersji) oraz od tego co się nasmarowało w metodzie init().

0

poprzednie problemy ustąpiły, lecz pojawiły sie kolejne :P

  1. czy da się jakoś wejść w menu Apletu ?
  2. dodałem sobie do mojego Apletu własne menu lecz gdy chce je rozwinąć to mi zanika i jest pod obrazkiem( korzystam z podwójnego buforowania). Da się to jakoś obejść. Rysuje na panelu .
    Poniżej daje kod klasy Apletu
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;

import javax.swing.*;


public class JJAplet  extends JApplet implements KeyListener,ActionListener {
	int height;
	int width ;
	Display anim;
    Image image;
    int press = 0;
    // wykreslacz ekranowy
Graphics2D device;
    // wykreslacz bufora
Graphics2D buffer;
	int status = 0;
	Hello hello;
	Thread b;

	public void init()
	{
		
	     addKeyListener(this);
	     anim = new Display();  
	     resize(anim.Max_X,anim.Max_YY  + 20);
	     JMenuBar menuBar = new JMenuBar();
		 
		 JMenu editMenu = new JMenu("Plik");
		 JMenuItem item = new JMenuItem("HighScores");
		 item.addActionListener(this);
		 editMenu.add(item);
		 menuBar.add(editMenu);
		 
	   	 getContentPane().add(anim);
	     this.setJMenuBar(menuBar);

	     do{
	     anim.name = JOptionPane.showInputDialog(this,"Podaj swoje imie. Min 3 znaki");
	     if (anim.name == null) anim.name = "1";
	     }while(anim.name.length()<3);
	     this.show();
         
	}
	
	public void start()
	{
		if(anim.b == null){
			anim.startAnimation();
			anim.b = new Thread(anim);
			anim.b.start();
		}
	}
	
	public void stop()
	{
		anim.b = null;
	}
	
	
	public void keyPressed(KeyEvent arg0) {
		if(arg0.getKeyChar() != 'p')
		anim.player.set(arg0);
		else pause();
		
	}
	
	public void pause(){
		press++;
		if(press%2 == 0){
		anim.b.suspend();
		JOptionPane.showMessageDialog(null, "Game Paused");

		}
		else anim.b.resume();
	}

	@Override
	public void keyReleased(KeyEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void keyTyped(KeyEvent arg0) {
		// TODO Auto-generated method stub
			
}

	@Override
	public void actionPerformed(ActionEvent arg0) {
	 LoadHighScore();	
	}
	
		
	public  void LoadHighScore(){
        try{
            File fh = new File("HighScores.txt");
            FileReader fr= new FileReader(fh);
            BufferedReader buf = new BufferedReader(fr);
            
            String tmpl = buf.readLine();
            buf.close();
            int comma=0;
            int dot = 0;
            if (tmpl!=null){
                comma = tmpl.indexOf(",");
                dot = tmpl.indexOf(".");
                String tmps = tmpl.substring(0,comma);
                String pl = tmpl.substring(comma+1,dot); 
                //System.out.println(tmps);
                JOptionPane.showMessageDialog(this, "High Score = "+ Integer.valueOf(tmps)+ " is set by Player " + pl);
            }
                            
        } catch (IOException e){
        	 JOptionPane.showMessageDialog(this, "You are a first player");
        }
}

}

0

Kilka uwag, które mi się narzuciły:

  1. Używasz przestarzałego modelu wątków, co objawia się używaniem metod Thread.suspend() i Thread.resume(). Są one nieakceptowalne - szczególnie w apletach, które używając Swinga mają wymagania co do poprawności aplikacji mają nawet wyższe niż "stacjonarne" programy swingowe. Powinieneś zastąpić ich wywołanie zmianą jakiejś zmiennej, która zatrzyma/przerwie pętlę animacji w konkretnym wątku. Ewentualnie dziedzicząc po Thread można dołożyć metodę, której wywołanie będzie ustawiało lokalne pole w takim obiekcie i to pole będzie sterowało działalnością metody run().
  2. Zapomnij o akceleracji grafiki w apletach. Możliwości graficzne apletów są takie jakie oferuje przeglądarka i nie większe. Można to zaliczyć do "przedwczesnej optymalizacji". Zamiast lepszego wyświetlania dostaje się masę niepotrzebnych efektów ubocznych. No chyba, że jako aplet zrobisz grę na poziomie zbliżonym do Guild Wars, wtedy taka próba optymalizacji grafiki będzie jak najbardziej na miejscu. :)
  3. Wątek jest w Javie zasobem systemowym, którego nie można zniszczyć przez zgubienie do niego referencji. Najpierw wątek trzeba zakończyć aby móc zwolnić pamięć dla niego i dopiero przy obu spełnionych warunkach jest on usuwany. Dlatego instrukcja anim.b = null w stop() nie ma sensu. Gubisz referencję do działającego wątku.
  4. Metody start i stop nie muszą być komplementarne. Nie jest powiedziane, że ilość wywołań start będzie równa ilości wywołań stop, ani tego, że będą one wywoływane naprzemiennie. Musisz to uwzględniać. Metoda start i stop muszą sensownie obsługiwać chowanie i pojawianie się apletu, ale metody te mogą by wywoływane wielokrotnie po sobie - czasem bez większego sensu.
  5. Nigdy i w żadnej metodzie obsługi zdarzenia nie rób niczego o czym wiesz, że może trwać więcej niż kilkadziesiąt milisekund. Wszelkie wywoływania pause, sleep itp. są w nich bez sensu bo zatrzymują kolejkę zdarzeń Swinga, która jest odpowiedzialna za grafikę GUI w Javie. Stąd zapewne masz problemy z wyświetlaniem menu (niektóre).

1 użytkowników online, w tym zalogowanych: 0, gości: 1