Dynamiczne przyciski

0

WItam. Mam problem jak stworzyć dynamiczne przyciski w kontenerze JPanel. Chcę poprzez naciśnięcie przycisku "Nowa gra" na wylosowanych pozycjach umieścić 3 inne JButtony w tym samym oknie (JPanel) oraz wczytywać do nich ikony i nazwy. Następnie klikając na nie usuwać je z JPanel. Gdy usuniemy wszystkie, kolejne naciśnięcie "Nowa gra" umieści na tych samych pozycjach 3 JButtony, a następnie wczytujemy do nich inne ikony i nadajemy im inne nazwy.

Przyciski mają ikony liter oraz nazwę taką, jaką literę mają w danym momencie. Litery te skłądają sięna wyrazy np. koń, kot, osa. Trzeba je naciskać w odpowiedniej kolejności tak aby tworzyły ten wyraz, a po naciśnięciu mają znikać. działa to na zasadzie licznika i porównywania nazwy przyciku z tablicą Stringów np. String kot={"k", "o", "t"). Jezeli licznik jest 0 (kot[0] jest "k") i nacisnęliśmy przycisk "k" to przycisk z literą k znika (bo k=k), a następnie licznik zwiększamy o 1. A gdy licznik =3 to zerujemy go.

Problem polega na tym, że dla kilku różnych wyrazów działa w miarę dobrze ale chwilami się wywala bo jakimś cudem z przycisku odczytuje inne nazwy niż są lub jakimś cudem np kot[1] jest równy "t"?

Losuję wyraz a następnie w pętli Switch case 1:(dla wyrazu kot) case2:(dla wyrazu koń) itd losuję trzy pozycje przycisków klasą Random, następnie dodaję te przyciski do JPanel, wczytuję ikony metodą setIcon i nadaję nazwę setName, a gdy naciśniemy na niego to usuwam metodą JPanel.remove(przycisk)itd dla każdego z wylosowanych wyrazów.
Do przycisku "Nowa gra" dodaję ActionListener, potem metoda actionPerformed a w niej MouseListener i mouseClicked dla przycisków z literami.
Może ktoś ogarnia co może być nie tak....

0

Ja stosuję taka sekwencję: remove(), add(), validate() i repaint().

0
if(source==wybor[kot_tab[counter]]){
									oknoPanel.remove(source);
									oknoPanel.add(ulozone[counter]);
									ulozone[counter].setVisible(true);
									ulozone[counter].setIcon(ikony[counter]);
									oknoPanel.repaint();
									counter++;
									source=null;
									System.out.println("Poprawna litera");
								}


else {
									System.out.println("To nie jest kolejna literka");
								}
								if (counter==3){
									counter=0;
									source=null;
								}
 

Mam taki fragment kodu.
Jeśli naciśnięty przycisk jest przyciskiem z ikoną "k" to usuwamy ten przycisk i dodajemy inny w innym miejscu też z ikoną "k", jeśli warunek nie jest spełniony to System.out.println("To nie jest kolejna literka");
Po pierwszym naciśnięciu na "Nowa gra" działa, ale po drugim się wysypuje tzn. wchodzi zarówno w if jak i else tej samej pętli... O co może chodzić?

0

Użyj debuggera i sprawdź dzięki temu co się dokładnie dzieje. Wykonanie kodu zarówno z if i else jest po prostu niemożliwe.
Nigdy do porównywania stringów nie używaj operatora == - on zachowa się tak jak Ci się wydaje tylko w konkretnych warunkach(na których nie można polegać). Od tego jest metoda equals.

//dlaczemu w javie nie ma przeciążania operatorów?? :/

0

Tak jak mówiłem przy pierwszym "obiegu" program działa jak należy, a przy drugim po naciśnięciu na pierwszy przycisk wykonuje się jakby dwa razy, a chciałoby się raz... Nie mam pojęcia o co chodzi...

1

Pewnie dwa razy jest dodany ActionListener. Masz wybór, więcej kodu albo wizyta u wróżki.

0
nowa_gral.addMouseListener(new MouseListener(){
			
			
			public void mouseClicked(MouseEvent e) {
				
				for(int i=0; i<24; i++){
					oknoPanel.remove(wybor[i]);
					}
				for (int i=0; i<8; i++){
					oknoPanel.remove(ulozone[i]);
				}
				oknoPanel.validate();
				oknoPanel.repaint();
				
				
				Random los_o=new Random();
				switch(los_o.nextInt(obrazki.length)){
				case 0:
					final int []kot_tab=Losowanie.losowanie(kotS);
					obrazek.setIcon(kot);
					oknoPanel.add(wybor[kot_tab[0]]);
					wybor[kot_tab[0]].setVisible(true);
					wybor[kot_tab[0]].setIcon(k);
					oknoPanel.add(wybor[kot_tab[1]]);
					wybor[kot_tab[1]].setVisible(true);
					wybor[kot_tab[1]].setIcon(o);
					oknoPanel.add(wybor[kot_tab[2]]);
					wybor[kot_tab[2]].setVisible(true);
					wybor[kot_tab[2]].setIcon(t);

					
					obrazek.addActionListener(new ActionListener(){
						public void actionPerformed(ActionEvent ae){
							System.out.println("Nacisnąłeś na obrazek");
						}});
					;
					for(int i=0;i<3;i++){
						wybor[kot_tab[i]].addMouseListener(new MouseListener(){
							
							public void mouseClicked(MouseEvent me){
								
								JButton source = ((JButton)me.getSource());
								Rectangle aaa=source.getBounds();
								System.out.println(aaa.x);
								ImageIcon ikony[]={k,o,t};
								
								System.out.println("counter= "+counter);
								System.out.println();
								if(source.equals(wybor[kot_tab[counter]])){
									oknoPanel.remove(source);
									oknoPanel.add(ulozone[counter]);
									ulozone[counter].setVisible(true);
									ulozone[counter].setIcon(ikony[counter]);
									oknoPanel.repaint();
									source=null;
									counter++;
									System.out.println("Poprawna litera");
								}
							
								else {
									System.out.println("To nie jest kolejna literka");
									
								}
								if (counter==3){
									counter=0;
									
								}
				
							}

 
0

Nie wiem czym jest zmienna obrazek.

     public void mouseClicked(MouseEvent e) 
     {
         ...
         obrazek.addActionListener(new ActionListener()
         {
              public void actionPerformed(ActionEvent ae)
              {
                   System.out.println("Nacisnąłeś na obrazek");
         }});

Ale każde kliknięcie powoduje dodanie do obrazka nowego ActionListenera, zatem ilość wypisywanych komunikatów Nacisnąłeś na obrazek rośnie.

0
 
obrazek.addActionListener(new ActionListener(){
						public void actionPerformed(ActionEvent ae){
							System.out.println("Nacisnąłeś na obrazek");
						}});

Ta cześć kodu jest nie istotna, bo dotyczy innego przycisku JButton. Najważniejsze sa te trzy występujące w kodzie. Może masz jakąś koncepcje jak zrobić inaczej żeby przyciski znikały tylko gdy są naciskane w odpowiedniej kolejności...?

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