Ciao a tutti
sto sviluppano un progetto in java per l'università e dobbiamo implementare gli scacchi
Per quanto riguarda la scacchiera abbiamo creato un JPanel con gridlayout e, dentro, in un ciclo for gli abbiamo fatto aggiungere al layout JButton o JLabel: abbiamo in pratica un layout 10x10 con nel contorno le jlabel che indicano le coordinate e subito all'inteno 8x8 jbutton
ad ogni jbutton abbiamo dato un nome che riporta le sue coordinate, nonchè un background color bianco/nero a seconda di quale casella rappresenta in scacchiera
nella fase di inserimento dei jbutton, scorriamo una lista che contiene tutti i pezzi, e che avevamo già creato e riempito in precedenza, e in base al pezzo fa un setIcon sul jbutton
abbiamo anche implementato la action listener e, al primo clik del mouse prendiamo il nome del jìbutton e cambiamo il suo sfondo in giallo, al secondo clik prendiamo ancora il name e impostiamo lo sfondo in giallo, dopodichè avendo partenza e destinazione richiamiamo un metodo che dovrà eseguire i vari controlli e far fare la mossa al pezzo in questione
vi riporto il codice dell'action listener implementata
questo è il metodo richiamato dall'action listener nel caso di secondo click effettuato:codice:public class BottoneClick implements ActionListener { public void actionPerformed(ActionEvent evento) { conta_click++; JButton source_partenza = new JButton(); JButton source_destinazione = new JButton(); Color bg_partenza, bg_destinazione; if (conta_click == 1){ source_partenza = (JButton)evento.getSource(); //source_partenza.setSelected(true); source_partenza.setBackground(Color.YELLOW); partenza = source_partenza.getName(); /* System.out.println("conta_click = " + conta_click); System.out.println("destinazione = " + destinazione); System.out.println("partenza = " + partenza); */ }else{ source_destinazione = (JButton)evento.getSource(); //source_destinazione.setSelected(true); source_destinazione.setBackground(Color.YELLOW); destinazione = source_destinazione.getName(); /* System.out.println("conta_click = " + conta_click); System.out.println("destinazione = " + destinazione); System.out.println("partenza = " + partenza); */ } if (conta_click == 2) { //Gioca mossa = new Gioca(partenza, destinazione, scacchi, lista_pezzi); conta_click = 0; /* System.out.println("conta_click = " + conta_click + "- Gioco la mossa"); System.out.println("destinazione = " + destinazione); System.out.println("partenza = " + partenza); */ spostaPezzo(partenza, destinazione, source_partenza, source_destinazione); } } }
e questo il metodo cambiaPosizione dell'oggetto pezzo:codice:public void spostaPezzo(String partenza, String destinazione, JButton bottone_partenza, JButton bottone_destinazione){ // togliamo 1 in quanto la dimensione del tavolo e' 10 e quella della matrice 8 int partenza_X = Integer.parseInt(partenza.substring(0,1)); int partenza_Y = Integer.parseInt(partenza.substring(1)); int destinazione_X = Integer.parseInt(destinazione.substring(0,1)); int destinazione_Y = Integer.parseInt(destinazione.substring(1)); for (Iterator i = lista_pezzi.iterator() ; i.hasNext();){ Pezzo pezzo = (Pezzo)i.next(); if (pezzo.getCoordinate().compareTo((partenza_X-1) + "" + (partenza_Y-1)) == 0){ pezzo.cambiaPosizione(partenza_X, partenza_Y, destinazione_X, destinazione_Y, bottone_partenza, bottone_destinazione); } } }
a parte i system.out che ci sono di debug, praticamente il bottone di partenza, nell'ultimo metodo che ho riportato, dovrebbe tornare al colore originario (bianco/nero) e la sua icona scomparirebbe, mentre nella destinazione torna il colore di fondo originario e ha impostata l'icona relativa al pezzo che ora lo occupacodice:public void cambiaPosizione(int partenza_X, int partenza_Y, int destinazione_X, int destinazione_Y, JButton bottone_partenza, JButton bottone_destinazione){ System.out.println("Coordinate iniziali del Pezzo: X = " + super.coord_X + " Y = " + super.coord_Y); System.out.println("Coordinate iniziali passate: X = " + partenza_X + " Y = " + partenza_Y); bottone_partenza.setIcon(null); bottone_partenza.setBackground(Color.RED); setIcona(bottone_destinazione); bottone_destinazione.setBackground(Color.RED); setCoordinate(destinazione_X-1, destinazione_Y-1); System.out.println("Coordinate finali: X = " + destinazione_X + " Y = " + destinazione_Y); System.out.println("Coordinate finali del Pezzo: X = " + super.coord_X + " Y = " + super.coord_Y); }
I colori originali di fondo li abbiamo impostati a red per vedere che succedeva, ma eseguendo si verifica questo:
1. primo click: il jbutton ha il background che diventa giallo, l'event prende il suo nome
2. secondo clik: il jbutton ha bg che diventa giallo, l'event prende il nome
3. l'action invoca il metodo spostaPezzo
4. spostaPezzo invoca cambia Posizione
5. il jbutton di partenza rimane con fondo giallo e la stessa icona che aveva in precedenza, quello di destinazione diventa con fondo rosso e l'icona del pezzo che ora lo occupa
in pratica sembra che i jbutton non si rinfreschino da soli .. è normale o c'è qualche comando che li fa riaggiornare? Oppure dobbiamo far vedere nuovamente tutto il jpanel?
ringrazio già da ora chi ci aiuterà ... noi siamo a smadonnare da 2gg per risolvere sta cosa![]()

Rispondi quotando