Nowe okno w aplecie, osadzone w przeglądarce.

0

Witajcie, dalej wgłębiam się w tajniki języka java i po napisaniu programu chce go przekonwertować na aplet. Natrafiłem jednak na przeszkodę następującego rodzaju. W moim programie każdą nową klasę dziedziczącą z JFrame otwierałem zamykając okno dispose(); i otwierając nowe new Start();, new OknoGlowne(); itp. W programie wyglądało to następująco:

public class Pro1 {
    public void main() {
          JFrame j = new Start();
          j.setVisible(true);
    }
}

Oczywiście w AppletViewer taki kod przekształcony na aplet:

public class Pro1 {
    public void init() {
          JFrame j = new Start();
          j.setVisible(true);
    }
}

działa, ale wszystko otwiera się w nowym oknie. Ja chciałbym tak przerobić kod, żeby każde kolejne okno otwierało mi się w apletowej ramce osadzonej na stałe w htmlu. Nie udało mi się wygooglać, ani znaleźć w tutorialu takiego rozwiązania, więc proszę o pomoc.

0

To nie korzystaj z JFrame, chyba proste...
użyj JPanel .... applet.add(twojJPanel);

0

Sądziłem że applety rządzą się swoimi własnymi, magicznymi prawami i to mnie zgubiło. Rozwiązanie rzeczywiście banalne, tylko wystarczyło zmienić dziedziczenie klasy Start() z JFrame na JPanel i ustawić:

JPanel aplet= new Start();
add(aplet);

Dzięki za pomoc!

0

Jeszcze jedno pytanie. Teraz, aby w nowo otwartym panelu po naciśnięciu buttona otworzyć panel (zajmujący cała wielkość okna), znajdujący się w innej klasie, muszę jakoś skillować stary panel przed dodaniem nowego? Jak dodaje nowy panel (również zajmujący całą wielkość okna) i refreshuje go, to widoczny jest cały czas stary panel. Z okienkami nie miałem problemu. Stosowałem dispose() do zamknięcia nowego okna i new Start() do otwarcia nowego, chciałbym taki sam efekt uzyskać na panelach w aplecie. Zamykam jeden panel i w jego miejsce otwieram inny, z innej klasy. Pomóżcie proszę ;-)

0

aplet.remove(starypanel)
aplet.add(nowypanel)
i...
aplet.validate() albo aplet.revalidate() , nie pamiętam

0

Dzięki Keraj za odpowiedź, Twoja rada mi pomogła, jednak od kiedy mi odpisałeś praktycznie cały czas męczę się z następującym problemem: nie rozumiem dlaczego nie następuje inkrementacja w nowagra.addActionListener(new ActionListener(). Mój aplet ma następującą strukturę:

class Start extends JPanel
{

        static private JPanel tlo = new JPanel();
	public Start(){
        add(tlo); 
	PanelGlowny();
	...

		}

	public void PanelGlowny(){
	
		JButton nowagra = new JButton();
                tlo.add(nowagra);
		...//buttony
		
	        Pro1.okno++;
		JLabel test = new JLabel("okno: "+Pro1.okno);
		tlo.add(test);
		...

		nowagra.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				
				Pro1.okno++;

			}	
		});	
	}
}


class OknoGlowne extends JPanel
{
      	public OknoGlowne() {
		
		OknoGlowne1();
		...
	}

	public void OknoGlowne1(){
	...
	}
}

public class Pro1 extends JApplet {

	static int okno=0;
	
	public void init(){
	
		JPanel aplet= new Start();
		add(aplet);

		if (okno>=2){				
		remove(aplet);
		JPanel aplet2= new OknoGlowne();
		add(aplet2);
		}
	}
}

Chciałbym, aby statyczna zmienna okno zmieniała swoją wartość w ActionListenerze. Inkrementacja Pro1.okno++ poza ActionListenerem zwiększa o 1 wartość zmiennej okno, ale ta wewnątrz niego, po kliknięciu w przycisk nowagra, juz nie... Problem nie leży w działaniu przycisku, ActionListener funkcjonuje prawidłowo np. przy otwarciu JFrame: new PoziomTrudności(), zawarty u mnie w dalszej części mojego programu. Z pewnością mam problem z rozumieniem zasady działania i nadpisywania zmiennej static int okno. Od razu piszę, że nie potrafię posługiwać się wzorcem projektowym Singleton, chyba jeszcze dla mnie na to za wcześnie. Kolejny raz proszę o dobre rady [wstyd]

0

Ja tak coś myślę, że w actionPerformed zwiększasz wartość okno tak jak się należy, ale dalej to byś chciał, żeby w związku z tym coś się samo stało, a nic się nie dzieje. Tak wnioskuję, bo widzę, że sprawdzenie tego okna masz w metodzie init(), a ta wywoła się tylko raz na początku. Po zwiększeniu okna musisz wywołać jakąś metodę w klasie Pro1. Żeby to zrobić to do klasy start musisz sobie przekazać referencję do apletu. Czyli np. JPanel aplet= new Start(this);
I w klasie Start odpowiedni konstruktor, który przypisze parametr do pola, a tego użyjesz w obsłudze zdarzenia.

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