Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361

    Evento mouseClicked per JLabel

    Salve comunità di html.it,torno a scrivere dopo un po' per un problema che mi assilla

    Ho appena cominciato a lavorare con JFrame , JPanel e compagnia bella, e vorrei capire come gestire eventi generati dal click del mouse sui componenti creati.

    Nello specifico vorrei un modo semplice per gestire il click del mouse su diverse JLabel,che ho utilizzato al posto dei JButton perchè voglio avere delle immagini senza bordi/ombre e cose del genere (so che potrei provare "trasformare" dei bottoni in immagini ma mi pare poco sensato).

    Per andare dritti al problema ho 8 diverse JLabel, e vorrei poter riconoscere quale è stata cliccata.
    Ho cercato un po' in giro e ho visto che ad esempio un actionListener non puo' essere aggiunto a una JLabel.
    Ho trovato questo modo utilizzando mouseAdapter ma onestamente penso che passare un metodo dentro a un costruttore sia inguardabile:

    codice:
    label.addMouseListener(new MouseAdapter()  //assumiamo che label sia una JLabel ovviamente
            {  
                public void mouseClicked(MouseEvent e)  
                {  
                  //fai qualcosa
                }  
            });
    Inoltre in questo modo dovrei usare il costruttore per ogni JLabel?

    Infine ho un ultimo dubbio: dopo avere cliccato una delle immagini voglio che il programma faccia cio' che deve ignorando altri eventuali click prima che sia stato ad esempio ridisegnato un pannello,
    ha senso aggiungere i mouseListener e poi rimuoverli ad ogni passaggio?

    Scusate per eventuali sciocchezze dette, come detto ho appena cominciato con java Swing e molti concetti li trovo abbastanza rognosi

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Nello specifico vorrei un modo semplice per gestire il click del mouse su diverse JLabel,che ho utilizzato al posto dei JButton perchè voglio avere delle immagini senza bordi/ombre e cose del genere (so che potrei provare "trasformare" dei bottoni in immagini ma mi pare poco sensato).
    Chiaramente bisognerebbe vedere cosa vuoi fare e a cosa servono queste "azioni" ma di per sé non sarebbe affatto inappropriato avere dei pulsanti JButton con solo immagini (le "toolbar" sono fatte così infatti!). Insomma potrebbe avere senso.
    Poi è ovvio che se non vuoi le decorazioni predefinite di JButton, basta togliere bordi/margini/sfondo standard e bastano pochi setXyz per farlo. E se devi usarne svariati, nella buona ottica OOP, si potrebbe anche estendere JButton per specializzarlo.

    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Ho cercato un po' in giro e ho visto che ad esempio un actionListener non puo' essere aggiunto a una JLabel.
    ActionListener no, infatti. Ma MouseListener sì.

    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Ho trovato questo modo utilizzando mouseAdapter ma onestamente penso che passare un metodo dentro a un costruttore sia inguardabile:

    codice:
    label.addMouseListener(new MouseAdapter()  //assumiamo che label sia una JLabel ovviamente
            {  
                public void mouseClicked(MouseEvent e)  
                {  
                  //fai qualcosa
                }  
            });
    Questa è una "anonymous inner class". E non sono affatto "inguardabili". Specialmente in ambito AWT/Swing è molto comune/tipico usarle. La dimensione della anonymous class però è bene che sia abbastanza contenuta altrimenti ..... certo che diventa inguardabile!

    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Inoltre in questo modo dovrei usare il costruttore per ogni JLabel?
    Ad ogni JLabel potrebbe essere associato un distinto oggetto MouseListener oppure potrebbe essere usato lo stesso identico oggetto MouseListener per tutti i JLabel.
    Dipende molto da cosa devi fare e su che cosa e se il MouseListener deve tenere (per qualunque motivo) dello "stato" specifico per ciascun JLabel, nel qual caso è chiaro che devono essere distinti.

    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Infine ho un ultimo dubbio: dopo avere cliccato una delle immagini voglio che il programma faccia cio' che deve ignorando altri eventuali click prima che sia stato ad esempio ridisegnato un pannello,
    ha senso aggiungere i mouseListener e poi rimuoverli ad ogni passaggio?
    No, avrebbe poco senso.
    Meglio gestire la cosa a livello di "logica applicativa" con dei flag o altro.
    Ultima modifica di andbin; 08-05-2015 a 20:57
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Allora intanto grazie per la risposta , dopo aver smanettato due ore cerco di mettere quello a cui sono arrivato.

    Innanzitutto le JLabel/JButton servirebbero solo come pulsanti per inserire pedine nel campo di gioco,quindi l'unica cosa che mi interessa è poter distinguere su quale colonna il giocatore vuole inserire la pedina.

    Per ora ho usato JButton perchè per poterli distinguere uso il metodo get/setActionCommand() che JButton eredita da JAbstractButton mentre JLabel non ha,ma se posso fare altrimenti ben venga,visto che risparmierei il metodo per "pulire" il bottone.

    Metto quello a cui sono arrivato:

    codice:
    //Qui siamo nella classe di gestione del JFrame metto solo la parte del costruttore del frame interessata
    pulsanti=new JButton[8];
    .................................
    Opzioni o=new Opzioni();
    for(int i=0;i<8;i++)
    {
    	JButton b=new JButton(new ImageIcon("img....."));
    	b.setPreferredSize(new Dimension(50,50));
    	pulsanti[i]=pulisciBottone(b);
    	pulsanti[i].setActionCommand(""+i); //uso questo metodo per riconoscere i bottoni
    	pulsanti[i].addMouseListener(o);
    	ovest.add(pulsanti[i]);
    }
    public static JButton pulisciBottone(JButton b)
    {
    	b.setFocusPainted(false);
            b.setMargin(new Insets(0,0,0,0));
    	b.setContentAreaFilled(false);
            b.setBorderPainted(false);
            b.setOpaque(false);
    	return b;
    }
    E per la gestione degli eventi :

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    public class Opzioni implements MouseListener
    {	
    	public void mouseClicked(MouseEvent e)
    	{
    		JButton b=(JButton)e.getComponent();
    		System.out.print("\nMouse cliccato su "+b.getActionCommand());
    	}
    	public void mouseEntered(MouseEvent e)
    	{
    		JButton b=(JButton)e.getComponent();
    		System.out.print("\nMouse entrato su "+b.getActionCommand());
    	}
    	public void mouseExited(MouseEvent e){}
    	public void mouseReleased(MouseEvent e){}
    	public void mousePressed(MouseEvent e){}
    }

    Immagino che possa fare schifo l'uso di variabili e metodi statici ma sono troppo abituato

    Per quanto riguarda la tua ultima parte di risposta parli di "logica applicativa" con flag e altro , mi spiegheresti meglio cosa intendi?

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.