Visualizzazione dei risultati da 1 a 2 su 2
  1. #1
    Utente di HTML.it L'avatar di Fichico
    Registrato dal
    Nov 2002
    residenza
    Bologna
    Messaggi
    581

    Jpanel con JButton ... aggiornare grafica

    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
    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);
    			}
    		}
    	}
    questo è il metodo richiamato dall'action listener nel caso di secondo click effettuato:
    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);
    			}
    		}
    		
    	}
    e questo il metodo cambiaPosizione dell'oggetto pezzo:
    codice:
    	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);
    	}
    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 occupa

    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

  2. #2
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    906
    dopo aver chiamato spostaPezzo(), provate a fare un repaint() del JPanel.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.