Wykrywanie kolejności

0

Witam, może jest ktoś w stanie pomóc. Jak stworzyć wykrywanie wciskania przycisków JButton? Mam np. 4 przyciski JButton o nazwach P, I, E, S. Chciałbym stworzyć funkcje która jeśli naciśniemy na przycisk P to ustawia set.Visible(false) na niego, a jeżeli inny niż P to (System.out.println("To nie jest P")). Później jeżeli wcisnęliśmy już P i ten zniknął, to jeżeli wciśniemy I to ustawia set.Visible(false) dla niego, a jeżeli inny niż I to (System.out.println("To nie jest I")) itd. ze wszystkimi czterema tak aby wybrać prawidłowo np. wyraz PIES.

0

Zamiast setVisible dawałbym raczej setEnabled, to raz. Dwa zrób mapę tych buttonów:

Map<String,JButton> mapa = new HashMap<String,JButton>();
mapa.put("A",new JButton....
//itd

I potem masz listę literek do sprawdzenia i tesujesz czy kliknięty guzik jest kolejną z literek na podstawie tej mapy.

0

Można i bez mapy,

public void actionPerformed(ActionEvent ae)
{
     String cmd=ae.getActionCommand();
     if(cmd.equals("P"))
     ...
}
0

nie znam javy, ale w każdym innym cywilizowanym języku programowania event rzucany przez kontrolkę UI zawiera pole, które na tą kontrolkę wskazuje. ActionEvent dziedziczy po EventObject, które definiuje pole source oraz metodę getSource(). zgaduję, że wystarczy z tego skorzystać, zamiast rzeźbić takie... hmm... dziwactwa.

0

To "dziwactwo" jest wygodne, kiedy masz klika możliwych źródeł zdarzenia (przycisk, pozycja w menu, ...), które mają spowodować ten sam skutek. Sources zdarzeń są różne, ale actionCommand może być takie samo.

0
 
for(int i=0;i<48;i++){								//dodawanie słuchacza do wszystkich 48 przycisków
			wybor[i].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
				String text[]={"k","o","t"};
					JButton source = ((JButton)e.getSource());
					String label = source.getName();
							if(label == text[counter]) {
							source.setVisible(false);
							System.out.println(counter);
							counter++;
							
							
							}
							else {
								wybor[a1].setVisible(true);		//trzy wybrane przyciski do wyrazu "kot"
								wybor[b1].setVisible(true);
								wybor[c1].setVisible(true);
								counter = 0;
							}
							if(counter==3){
								counter=0;
							}
				}});
							
				
			}				

Stworzyłem coś takiego, ale działa tylko w pierwszym obiegu i się sypie, tak jakby nie zerowało zmiennej counter. Dodam, iż counter jest zmienną globalną i static. Wie ktoś dlaczego to nie działa? i jak wkomponować, że jeśli wybierzemy złą literę to wyświetli się odpowiedni komunikat.

0

Takie pytanko - co po dokładnie ci setVisible(false)?
Teraz spróbuj tak:
a) przyciski twórz za pomocą metody, np (zakładam, że przyciski umieszczasz na JPanelu, ale to może być praktycznie dowolna klasa), mniej więcej tak:

 
public class MyPanel extends JPanel implements ActionListener {
	String[] charArray = {"P","I","E","S"};
        JButton[] buttonList;
	private JButton createButton(String s, int i){
		JButton jb = new JButton(s);
		jb.setActionCommand(i+"");
		jb.addActionListener(this);
		return jb;
	}
	public void createButtons(){
		buttonList = new JButton[4];
		for(int i=0; i<4; i++){
			buttonList[i] = createButton(charArray[i], i);
			// tu możesz je jakoś umieścić na panelu za pomocą Layoutów, dodać do panelu 
		}
	}

b) teraz musisz dodać jeszcze metodę ActionPerformed (wyskoczy ci błąd kompilacji bez niej) do klasy, czyli:

 
	@Override
	public void actionPerformed(ActionEvent arg0) {
		int i = Integer.parseInt(arg0.getActionCommand());
		if(i==counter){
			buttonList[i].setVisible(false);
			counter++;
		} else {
			System.out.println("To nie jest litera "+charArray[counter]);
		}
		if(counter==charArray.length){
			counter = 0;
                        // generalnie nie wiedziałem, co chcesz żeby program robił kiedy już się skończą przyciski
                        // te dwie linijki pokazują przyciski na nowo
			for(JButton b: buttonList)
				b.setVisible(true);
		}
	}
0

Chodzi o to, że chcę napisać prostą gierkę. Układamy nazwy zwierząt przedstawionych na obrazku z rozsypanych liter. Utworzyłem przycisk JButton o wielkości 500x400 do wczytywania obrazka jako Icon, przyciski "Koniec" oraz "Nowa gra", oraz 48 przycisków do których wczytujemy literki, które musimy póżniej ułożyć i 8 przycisków pod obrazkiem gdzie wczytujemy już wybrane prawidłowo literki.

Naciskamy "Nowa gra", losowany jest obrazek oraz umieszczamy literki na wylosowanych przyciskach. Należy ułożyc literki w odpowiedniej kolejności tak aby stanowiły nazwę zwierzecia na obrazku. Mamy np. psa. Naciskamy na literkę "p". Przycisk z tą literką ustawiamy na setVisible(false) a pierwszy przycisk pod obrazkiem na setVisible(true) i wczytujemy do niego literkę "p" jako Icon. I tak robimy z następnymi. Jeżeli wybierzemy złą literkę (niezgodnie z kolejnościa wyrazu "pies") to pojawia się komunikat "To nie jest kolejna litera". Co sadzicie o tym kodzie, czy jest w miare poprawnie? Co jest źle użyte, jak to porawić? Program jest w początkowej fazie...

 
@SuppressWarnings("serial")
class Okno extends JWindow {
		Okno(){
			setSize(1024,768);
			setVisible(true);
			}
		}

@SuppressWarnings("serial") 
class Przycisk extends JButton{
	Przycisk(String nazwa, int x, int y, int szer, int wys){
		super(nazwa);
		setBounds(x, y, szer, wys);
		setVisible(true);
}
		
	
	}



public class Gra{
		static int counter=0;
		static Okno okno=new Okno();
		static ImageIcon ico=new ImageIcon("src/aa.gif");
		static ImageIcon kot=new ImageIcon("src/kot.jpg");
		static ImageIcon kon=new ImageIcon("src/kon.jpg");
		static ImageIcon pies=new ImageIcon("src/pies.jpg");
		static ImageIcon a=new ImageIcon("src/litery/a.gif");
		static ImageIcon aa=new ImageIcon("src/litery/aa.gif");
		static ImageIcon b=new ImageIcon("src/litery/b.gif");
		static ImageIcon c=new ImageIcon("src/litery/c.gif");
		static ImageIcon cc=new ImageIcon("src/litery/cc.gif");
		static ImageIcon d=new ImageIcon("src/litery/d.gif");
		static ImageIcon e=new ImageIcon("src/litery/e.gif");
		static ImageIcon ee=new ImageIcon("src/litery/ee.gif");
		static ImageIcon f=new ImageIcon("src/litery/f.gif");
		static ImageIcon g=new ImageIcon("src/litery/g.gif");
		static ImageIcon h=new ImageIcon("src/litery/h.gif");
		static ImageIcon i=new ImageIcon("src/litery/i.gif");
		static ImageIcon j=new ImageIcon("src/litery/j.gif");
		static ImageIcon k=new ImageIcon("src/litery/k.gif");
		static ImageIcon l=new ImageIcon("src/litery/l.gif");
		static ImageIcon ll=new ImageIcon("src/litery/ll.gif");
		static ImageIcon m=new ImageIcon("src/litery/m.gif");
		static ImageIcon n=new ImageIcon("src/litery/n.gif");
		static ImageIcon nn=new ImageIcon("src/litery/nn.gif");
		static ImageIcon o=new ImageIcon("src/litery/o.gif");
		static ImageIcon oo=new ImageIcon("src/litery/oo.gif");
		static ImageIcon p=new ImageIcon("src/litery/p.gif");
		static ImageIcon r=new ImageIcon("src/litery/r.gif");
		static ImageIcon s=new ImageIcon("src/litery/s.gif");
		static ImageIcon ss=new ImageIcon("src/litery/ss.gif");
		static ImageIcon t=new ImageIcon("src/litery/t.gif");
		static ImageIcon u=new ImageIcon("src/litery/u.gif");
		static ImageIcon w=new ImageIcon("src/litery/w.gif");
		static ImageIcon y=new ImageIcon("src/litery/y.gif");
		static ImageIcon z=new ImageIcon("src/litery/z.gif");
		static ImageIcon zz=new ImageIcon("src/litery/zz.gif");
		static ImageIcon zzz=new ImageIcon("src/litery/zzz.gif");
		static int a1;
		static int b1;
		static int c1;
		static int d1;
		
		static Przycisk nowagra=new Przycisk("Nowa Gra",110, 2, 100, 50);	
		static Przycisk obrazek=new Przycisk("Obrazek",524, 150, 500, 400);	
		static Przycisk koniec=new Przycisk("Koniec",2, 2, 100, 50);
		
		static JButton wybor[]=new JButton[48];
		static JButton litera[]=new JButton[9];
		
public static void main(String args[]){
			
			Container panel=okno.getContentPane();
			panel.setLayout(null);
			panel.setBackground(Color.blue);
			panel.add(koniec);
			panel.add(obrazek);
			panel.add(nowagra);
			
			for(int i=0;i<9;i++){
				 litera[i]=new Przycisk("", 525+62*i, 555, 62, 62); 
				 panel.add(litera[i]);
				 litera[i].setVisible(false);	 
			}
			for(int i=0;i<8;i++){
				 wybor[i]=new Przycisk("", 14+62*i, 164, 62, 62);
				 panel.add(wybor[i]);
				 wybor[i].setVisible(false);
			}
			for(int i=8;i<16;i++){
				 wybor[i]=new Przycisk("", 14+62*(i-8), 226, 62, 62);
				 panel.add(wybor[i]);
				 wybor[i].setVisible(false);
			}
			for(int i=16;i<24;i++){
				 wybor[i]=new Przycisk("", 14+62*(i-16), 288, 62, 62);
				 panel.add(wybor[i]);
				 wybor[i].setVisible(false);
			}
			for(int i=24;i<32;i++){
				 wybor[i]=new Przycisk("", 14+62*(i-24), 350, 62, 62);
				 panel.add(wybor[i]);
				 wybor[i].setVisible(false);
			}
			for(int i=32;i<40;i++){
				 wybor[i]=new Przycisk("", 14+62*(i-32), 412, 62, 62);
				 panel.add(wybor[i]);
				 wybor[i].setVisible(false);
			}
			for(int i=40;i<48;i++){
				 wybor[i]=new Przycisk("", 14+62*(i-40), 474, 62, 62);
				 panel.add(wybor[i]);
				 wybor[i].setVisible(false);
			}
			
		koniec.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				System.exit(0);
				}
			});

		
		nowagra.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent e){
				for(int i=0;i<48;i++){
					wybor[i].setVisible(false);}
					losowanie();
					}});
		} 
		

		

     
//METODY**************************************************************************************************************
		

		          
		        
//Metoda rozrzut obrazków i działanie------------------------------------------------------------------- 		
public static void losowanie()	{

Random los_l=new Random();
Random los=new Random();

	
	switch(los.nextInt(3)){
//Dla kota---------------------------------------------------------------------------------------------
		case 0:
			obrazek.setIcon(kot);
			a1=los_l.nextInt(48);
			
			
			
			
			
		wybor[a1].setVisible(true);
			wybor[a1].setIcon(k);
			wybor[a1].setName("k");
			
					do{
						b1=los_l.nextInt(48);
					  }
					while(a1==b1);
			
			wybor[b1].setVisible(true);
			wybor[b1].setIcon(o);
			wybor[b1].setName("o");
			
			
					do{
						c1=los_l.nextInt(48);
					  }
					while(c1==a1||c1==b1);
					
			wybor[c1].setVisible(true);
			wybor[c1].setIcon(t);
			wybor[c1].setName("t");

			for(int i=0;i<46;i++){
			wybor[i].addActionListener(new ActionListener(){
				public void actionPerformed(ActionEvent e){
					final String[] text = {"k","o","t"};
					
						JButton source = ((JButton)e.getSource());
						String label = source.getName();
						
							if(label == text[counter]) {
							source.setVisible(false);
							counter++;
							}
							else {
								wybor[a1].setVisible(true);
								wybor[b1].setVisible(true);
								wybor[c1].setVisible(true);
								counter = 0;
							}
							System.out.println(counter);
							if (counter==3)
								counter=0;
							
							
				}
							
							
				
					
				});
			
			}
			break;
//Dla konia-------------------------------------------------------------------------------------------------------			
		case 1:
			obrazek.setIcon(kon);
			a1=los_l.nextInt(48);
			wybor[a1].setVisible(true);
			wybor[a1].setIcon(k);
			
				do{
					b1=los_l.nextInt(48);
				  }
				while(a1==b1);
			
			wybor[b1].setVisible(true);
			wybor[b1].setIcon(o);
			
				do{
					c1=los_l.nextInt(48);
				  }
				while(c1==a1||c1==b1);
			
			
			wybor[c1].setVisible(true);
			wybor[c1].setIcon(nn);
		break;
//Dla psa------------------------------------------------------------------------------------------------------------		
		case 2:
			obrazek.setIcon(pies);
			a1=los_l.nextInt(48);
			wybor[a1].setVisible(true);
			wybor[a1].setIcon(p);
			
				do{
					b1=los_l.nextInt(48);
				  }
				while(a1==b1);
			
			wybor[b1].setVisible(true);
			wybor[b1].setIcon(i);
			
				do{
					c1=los_l.nextInt(48);
				  }
				while(c1==a1||c1==b1);
			
			
			wybor[c1].setVisible(true);
			wybor[c1].setIcon(e);
			
				do{
					d1=los_l.nextInt(48);
				  }
				while(d1==a1||d1==b1||d1==c1);
			
			
			wybor[d1].setVisible(true);
			wybor[d1].setIcon(s);
		break;
		}
}
}
0

tworzenie ImageIcon zamknij w jakąś pętlę, twórz je w tablicy a nie w milionie zmiennych - wczytuj albo wszystkie obrazki z katalogu, albo chociaż ponazywaj konsekwentnie pliki i wczytaj w pętli for.
stosujesz koszmarne formatowanie kodu. wcięcia powinny być zawsze takiej samej szerokości, robi się je tylko w blokach kodu, a nie w losowych momentach.
pozycjonowanie przycisków zamknij w większą pętlę.
po co static?

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