Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1

    Immagini e MouseListener

    Ciao a tutti... Sto creando un'applicazione java attraverso le librerie swing. In un JPanel dovrei mettere delle immagini che carico dal disco.. Fin qui tutto bene, le immagini vanno proprio dove devono andare.. Il problema è che quando l'utente va sopra questa immagini col mouse dovrei fare qualcosa.. Però non riesco ad aggiungere alle immagini un MouseListener come faccio solitamente con altri tipi di oggetti swing. Le immagini le diesegno attraverso la funzione g.drarImage con g che non è+ altro un oggetto Graphics; faccio tutto questo all'interno del metodfo paintComponents (Graphics g) ovviamente... Qualcuno sa come aggiungere ascoltatori dei mouse ad un'immagine?? Mi fareste un piacere..

  2. #2
    Ciao,

    da novello provo a postarti una mia soluzione ipotetica (almeno se c'è un altro metodo migliore lo imparo anche io):

    - Crei la tua immagine e la visualizzi tramite una jLabel
    - alla jLabel associ un listener con addMouseListener

    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Immagini e MouseListener

    Originariamente inviato da Nick083
    Qualcuno sa come aggiungere ascoltatori dei mouse ad un'immagine??
    Non si aggiungono listener ad una immagine!!! Si aggiungono listener ai componenti!

    Disegni sicuramente su un componente, quindi aggiungi il listener a quel componente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  4. #4
    Ad utilizzare JLabel per mettere le immagini avevo pensato anch'io... Solo che poi, siccome ci sono un insieme di una ventina di immagini che vanno a formare una planimetria, l'inserimento delle JLabel nella posizione esatta diventerebbe un grosso problema... Con la funzione drawImage di un oggetto Graphics, invece, la cosa sarebbe fattibile dato che accetta due parametri che corrispondono alla coordinata x e y dell'immagine che si sta andando a disegnare...

  5. #5
    Originariamente inviato da Nick083
    Ad utilizzare JLabel per mettere le immagini avevo pensato anch'io... Solo che poi, siccome ci sono un insieme di una ventina di immagini che vanno a formare una planimetria, l'inserimento delle JLabel nella posizione esatta diventerebbe un grosso problema... Con la funzione drawImage di un oggetto Graphics, invece, la cosa sarebbe fattibile dato che accetta due parametri che corrispondono alla coordinata x e y dell'immagine che si sta andando a disegnare...

    come ti hanno detto, i listener vanno messi ad un Component. Quindi ti tocca scegliere un component con cui visualizzarle, e star li di codice a posizionare questi component che vai a creare. se non usi LayoutManager nel panel dove posizionerai le jLabel, puoi settare la posizione delle jLabel in x e y e quindi fare sostanzialmente quello che fai col drawGraphic
    IP-PBX management: http://www.easypbx.it

    Old account: 2126 messages
    Oldest account: 3559 messages

  6. #6
    Si lo so che si aggiungono i listener ai componenti.. Speravo di trovare una soluzione un po' più comoda di star là a scrivere tutto... ch palle.. va beh.. adesso ci provo! Grazie intanto..

  7. #7
    ok.. alla fine sono riuscito a risolvere con una serie di JLabel contenenti le immagini a cui ho associato un ascoltatotre di Mouse... Adesso all'interno della funzione mouseEntered (MouseEvent evt) riesco tranquillamente a risalire alle coordinate di x e di y, ma a questo punto sarebbe più pratico riuscire a capire già da subito sopra che JLabel sono andato sopra... Avete qualche idea??? Io di solito facevo così:

    codice:
    public void mouseEntered (MouseEvent evt ){
            Object source1 = evt.getSource();
             if (source1 == stanze[i])                         
                    System.out.println ("Sei andato sopra la stanza " +i);
    }
    dove stenze[i] è l'array di JLabel con le immagini.. In questa maniera però questa volta non funziona... Avete delle idee??

  8. #8
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    perché invece di una semplice JLabel non utilizzi una tua classe che estenda JLabel e che contenga al suo interno tutto il necessario (per esempio, un'altra classe che estenda MouseAdapter e che abbia i giusti metodi che ti servono e nient'altro...)?
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  9. #9
    eh Andrea, non è semplice.. Cioè, la creazione di una nuova classe che estenda JPanel e che abbia i metodi necessari alla rilevazione del movimento del mouse sarebbe di per sè una cavolata, ma il problema mi sorge proprio per la realizzazione dei metodi!!
    Ti posto quello che sono riuscito a fare finora:

    Questa è la funzione MouseEntered che rileva il movimento del mouse:

    codice:
    public void mouseEntered (MouseEvent evt ){
            Object source1 = evt.getSource();
            Component l = evt.getComponent();
            System.out.println ("Ti sei mosso in posizione " + evt.getX() + " : " + evt.getY());
            Graphics g = this.getGraphics();
            int x = evt.getX();
            int y = evt.getY();
            int width, height, posizione, cx, cy;
            for (int i=0;i<posizioni.size();i++) {
                width = images[i].getImage().getWidth(this);
                height = images[i].getImage().getHeight(this);
                posizione = Integer.parseInt(posizioni.get(i).toString());
                cx = Integer.parseInt(xs.get(posizione).toString());
                cy = Integer.parseInt(ys.get(posizione).toString());
                System.out.println ("Caratteristiche dell'immagine in questione:\nLarghezza: "+width+"\nAltezza: "+height+"\nCoordinata x: "+cx+"\nCoordinata y: "+cy);
                if (x>=cx) {
                    System.out.println ("x maggiore di "+cx);
                    if (x<(cx+width)) {
                        System.out.println ("x minore di "+ (cx+width));
                        //System.out.println ("x minore di "+ (images[i].x+images[i].width));
                        if (y>=cy) {
                            System.out.println ("y maggiore di "+ cy);
                            if (y<=(cy+height)) {
                                System.out.println ("y minore di "+ (cy+height));
                                System.out.println ("Evidentemente sei andato sopra la stanza s"+i);
                            }
                            else 
                                System.out.println ("y non è minore della coordinata y finale " + (cy+height) + ". Mi fermo!");
                        }
                        else
                            System.out.println ("y non è maggiore della coordinata y iniziale " + cy + ". Mi fermo!");
                    }
                    else 
                        System.out.println ("x non è minore della coordinata x finale" + (cx+width) + ". Mi fermo!");
                }
                else 
                    System.out.println ("x non è maggiore della coordinata x iniziale: " + cx +". Mi fermo!");
    Come puoi vedere la serie di if/else serve a rilevare in che posizione il mouse si è spostato. Il problema è che le coordinate che ricevo tramite le funzione evt.getX() e evt.getY() si riferiscono al componente a cui ho agguinto un listener per il mouse e non al pannello totale!!! Ovviamente ho provato ad aggiungere il listener soltato al pannello (e quindi non ai vari componenti), ma non viene come vorrei (infatti alcuni componenti sono in mezzo al pannello e quindi se entro dentro il pannello mi trova la coordinata di "entrata" e non quella dove mi fermo...)..

    HELP!!!

  10. #10
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    Fermo, senza che mi leggo tutto quel ben di codice:

    codice:
    // tua classe contenitore...
    //...
    
    //classe che estende JLabel + classe ad-hoc
    private class MyJLabel extends JLabel {
            
            private class MyMouseAdapter extends MouseAdapter {
                
                private MyJLabel label;
                
                public MyMouseAdapter(MyJLabel label) {
                    this.label = label;
                }
                
                public void mouseEntered(MouseEvent me) {
                    System.out.println("Entrato in "+label.getName());
                }
                
                public void mouseExited(MouseEvent me) {
                    System.out.println("Uscito da "+label.getName());
                }
            }
            
            public MyJLabel(String icon, String name) {
                super(new ImageIcon(icon));
                this.setName(name);
                this.addMouseListener(new MyMouseAdapter(this));
            }
        }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

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.