Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2016
    Messaggi
    8

    rendere cliccabile un elemento di tipo Image in un JPanel

    Ciao a tutti, ho bisogno di rendere cliccabile(visualizzare un successivo frame ) questa immagine:

    for (int i=0;i<2;i++){
    Image miaImmagine;
    miaImmagine = Toolkit.getDefaultToolkit().getImage("/home/alessandro/Scrivania/download.jpeg");
    g.drawImage(miaImmagine,xs,ys,this);
    xs=xs +50; ecc..

    come posso fare??

    Ringrazio tutti in anticipo!

  2. #2
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Ciao

    Hai almeno due possibilità:

    1) Aggiungi al pannello un JButton a cui setti l'immagine (JButton ha un apposito costruttore a cui passi una ImageIcon).
    Quindi aggiungi al JButton un ActionListener che si occuperà di "ascoltare" il click del mouse, poi devi solo scegliere cosa fare.
    In caso avessi scartato questa via perché non vuoi che l'immagine abbia in nessun modo l'aspetto di un bottone, è molto semplice fare in modo di rimuovere tutte quelle caratteristiche (togliendo il bordo, gli insets, il focus e poco altro...) mostrando solo l'immagine.

    2) Aggiungi un ascoltatore direttamente al pannello (dovrai usare in questo caso un MouseListener), all'interno del metodo mousePressed() devi recuperare quale sia il punto cliccato con il mouse, e controllare se esso sia all'interno dell'immagine, se è così apri il nuovo frame, in caso contrario ignori l'evento.

    Quale sia il metodo migliore (al momento non ne vedo di migliori ma non lo escludo), beh dipende dal codice che stai usando...
    Con il primo metodo è più facile gestire il click del mouse, ma devi posizionare il bottone all'interno del pannello (con la maggior parte dei layout la cosa è comunque molto semplice).
    Con il secondo metodo puoi continuare a disegnare l'immagine nel pannello con il metodo drawImage, ma devi capire quando il click del mouse avviene all'interno dell'area dell'immagine (anche questa parte è fattibile comunque).

    Torna pure se hai qualche perplessità/domanda

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2016
    Messaggi
    8
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Ciao

    Hai almeno due possibilità:

    1) Aggiungi al pannello un JButton a cui setti l'immagine (JButton ha un apposito costruttore a cui passi una ImageIcon).
    Quindi aggiungi al JButton un ActionListener che si occuperà di "ascoltare" il click del mouse, poi devi solo scegliere cosa fare.
    In caso avessi scartato questa via perché non vuoi che l'immagine abbia in nessun modo l'aspetto di un bottone, è molto semplice fare in modo di rimuovere tutte quelle caratteristiche (togliendo il bordo, gli insets, il focus e poco altro...) mostrando solo l'immagine.

    2) Aggiungi un ascoltatore direttamente al pannello (dovrai usare in questo caso un MouseListener), all'interno del metodo mousePressed() devi recuperare quale sia il punto cliccato con il mouse, e controllare se esso sia all'interno dell'immagine, se è così apri il nuovo frame, in caso contrario ignori l'evento.

    Quale sia il metodo migliore (al momento non ne vedo di migliori ma non lo escludo), beh dipende dal codice che stai usando...
    Con il primo metodo è più facile gestire il click del mouse, ma devi posizionare il bottone all'interno del pannello (con la maggior parte dei layout la cosa è comunque molto semplice).
    Con il secondo metodo puoi continuare a disegnare l'immagine nel pannello con il metodo drawImage, ma devi capire quando il click del mouse avviene all'interno dell'area dell'immagine (anche questa parte è fattibile comunque).

    Torna pure se hai qualche perplessità/domanda
    Ho provato entrambe le soluzioni:

    - la prima trovo difficoltà a gestire il layout..vorrei potere definire delle coordinate a mio piacimento e non ce la faccio.


    - nel secondo mi risulta difficile trovare le coordinate , cioè definisco un X e y dell immagine, ma poi non riesco a renderle complementari a quelle del punto cliccato tramite actionlistener


  4. #4
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da spino8 Visualizza il messaggio
    Ho provato entrambe le soluzioni:

    - la prima trovo difficoltà a gestire il layout..vorrei potere definire delle coordinate a mio piacimento e non ce la faccio.


    - nel secondo mi risulta difficile trovare le coordinate , cioè definisco un X e y dell immagine, ma poi non riesco a renderle complementari a quelle del punto cliccato tramite actionlistener

    Il fatto è che di solito voler definire delle coordinate a proprio piacimento, ad esempio settando il layout a null e utilizzando i metodi setBounds() etc., è un metodo che alla lunga non paga, ci sono layout molto semplici da utilizzare, e usando in modo appropriato le distanze tra i componenti dei layout e i bordi puoi ottenere in modo semplice un'infinità di situazioni diverse.

    Per quanto riguarda il secondo metodo, se registri un listener sul pannello ottieni le coordinate relative al pannello.
    Il punto cliccato lo trovi con il metodo getPoint() applicato al MouseEvent del mousePressed (MouseEvent e).
    Il punto di partenza dell'immagine lo conosci già, perché la fai partire da quelli che hai chiamato xs e ys. A quel punto basta controllare che la x e la y del punto siano maggiori di xs e ys e minori di xs+miaImmagine.getWidth() e ys+miaImmagine.getHeight().

    Ovviamente senza vedere più codice non ci si può rendere conto della situazione, se hai modo/voglia posta più codice e provo a dirti come risolverei io la cosa.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2016
    Messaggi
    8
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Il fatto è che di solito voler definire delle coordinate a proprio piacimento, ad esempio settando il layout a null e utilizzando i metodi setBounds() etc., è un metodo che alla lunga non paga, ci sono layout molto semplici da utilizzare, e usando in modo appropriato le distanze tra i componenti dei layout e i bordi puoi ottenere in modo semplice un'infinità di situazioni diverse.

    Per quanto riguarda il secondo metodo, se registri un listener sul pannello ottieni le coordinate relative al pannello.
    Il punto cliccato lo trovi con il metodo getPoint() applicato al MouseEvent del mousePressed (MouseEvent e).
    Il punto di partenza dell'immagine lo conosci già, perché la fai partire da quelli che hai chiamato xs e ys. A quel punto basta controllare che la x e la y del punto siano maggiori di xs e ys e minori di xs+miaImmagine.getWidth() e ys+miaImmagine.getHeight().

    Ovviamente senza vedere più codice non ci si può rendere conto della situazione, se hai modo/voglia posta più codice e provo a dirti come risolverei io la cosa.
    this.addMouseListener(new MouseAdapter(){
    public void MousePressed(MouseEvent e){
    e.getPoint();

    if(e.getX()>xs & e.getY()>ys & e.getX()<xs+miaImmagine.getWidth(circleElement) & e.getY()<ys+miaImmagine.getHeight(circleElement))
    {
    JFrame info=new JFrame();
    info.setTitle("Informazioni sosta");
    info.setBounds(600, 200, 250, 360);
    info.setVisible(true);
    }
    }
    });

    ma non funziona !
    mi dice che il metodo Mouse Pressed non è utilizzato
    Ultima modifica di spino8; 02-07-2016 a 17:30

  6. #6
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Intanto ricorda di postare il codice che inserisci tra i tag [CODE] per mantenerlo formattato.

    Poi, se stai usando esattamente quel codice che hai postato, ricorda che mousePressed va con la m minuscola, altrimenti non stai facendo l'override del metodo di MouseAdapter, ma stai definendo un tuo metodo che non verrà mai richiamato in automatico.

    Un'altra cosa: l'operatore AND viene scritto con && .

    E poi che cos'è quel circleElement che passi a getHeight()? Un ImageObserver?

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2016
    Messaggi
    8
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Intanto ricorda di postare il codice che inserisci tra i tag [CODE] per mantenerlo formattato.

    Poi, se stai usando esattamente quel codice che hai postato, ricorda che mousePressed va con la m minuscola, altrimenti non stai facendo l'override del metodo di MouseAdapter, ma stai definendo un tuo metodo che non verrà mai richiamato in automatico.

    Un'altra cosa: l'operatore AND viene scritto con && .

    E poi che cos'è quel circleElement che passi a getHeight()? Un ImageObserver?
    Scusa avevo sbagliato a postare qui il codice, ora sembri funzioni. ti aggiorno!
    Ultima modifica di spino8; 03-07-2016 a 11:38

  8. #8
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Scusa se mi ripeto, ma dovresti davvero inserire il codice che posti tra i tag [CODE] , altrimenti si diventa matti a sistemarlo prima di capirci qualcosa...

    Riguardo al codice, ti evidenzio subito un primo errore: il MouseListener non va assolutamente aggiunto al pannello all'interno del metodo paintComponent, così come il caricamento dell'immagine, il paintComponent deve solo occuparsi della logica relativa al disegno, tutto il resto appesantisce il metodo e richiamarlo in continuazione rallenta inutilmente l'esecuzione.

    Puoi inserire queste parti nel costruttore di MultiCirclesPaintPanel, o in metodi appositi se il codice si allunga e devi richiamare più di un'immagine o altro.

    Da quello che vedo poi, aggiungi un'immagine per ogni CircleElement (se aggiungi anche il codice di questa classe si riesce anche a fare qualche prova), quindi nel mousePressed del MouseAdapter sarebbe conveniente ciclare sui tuoi circleElements per ricercare quello che contiene il punto cliccato ...

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2016
    Messaggi
    8
    Quote Originariamente inviata da Ansharja Visualizza il messaggio
    Scusa se mi ripeto, ma dovresti davvero inserire il codice che posti tra i tag [CODE] , altrimenti si diventa matti a sistemarlo prima di capirci qualcosa...

    Riguardo al codice, ti evidenzio subito un primo errore: il MouseListener non va assolutamente aggiunto al pannello all'interno del metodo paintComponent, così come il caricamento dell'immagine, il paintComponent deve solo occuparsi della logica relativa al disegno, tutto il resto appesantisce il metodo e richiamarlo in continuazione rallenta inutilmente l'esecuzione.

    Puoi inserire queste parti nel costruttore di MultiCirclesPaintPanel, o in metodi appositi se il codice si allunga e devi richiamare più di un'immagine o altro.

    Da quello che vedo poi, aggiungi un'immagine per ogni CircleElement (se aggiungi anche il codice di questa classe si riesce anche a fare qualche prova), quindi nel mousePressed del MouseAdapter sarebbe conveniente ciclare sui tuoi circleElements per ricercare quello che contiene il punto cliccato ...
    codice:
    
    
    codice:
    public class CircleElement extends JComponent{
        /**
         * 
         */
        
        private int centerX;
        private int centerY;
        private int radius;
        private Color fillColor;
        
        public CircleElement(int centerX, int centerY, int radius, Color fillColor) {
            this.centerX = centerX;
            this.centerY = centerY;
            this.radius = radius;
            this.fillColor = fillColor;
            
             
             
             
                
        
            
        }
    
    
        public int getCenterX() {
            return centerX;
        }
    
    
        public void setCenterX(int centerX) {
            this.centerX = centerX;
        }
    
    
        public int getCenterY() {
            return centerY;
        }
    
    
        public void setCenterY(int centerY) {
            this.centerY = centerY;
        }
    
    
        public int getRadius() {
            return radius;
        }
    
    
        public void setRadius(int radius) {
            this.radius = radius;
        }
    
    
        public Color getFillColor() {
            return fillColor;
        }
    
    
        public void setFillColor(Color fillColor) {
            this.fillColor = fillColor;
        }
    
    
    
    
        // Custom methods to get other useful informations
    
    
        public int getLeftX() {
            return getCenterX() - getRadius();
        }
    
    
        public int getTopY() {
            return getCenterY() - getRadius();
        }
    
    
        public int getDiameter() {
            return getRadius() * 2;
        }
        
                
        
        
    }
    Ma le coordinate dopo come le prendo nel costruttore?

    Comunque l'ideale sarebbe rendere cliccabili i CircleElement...ancora meglio delle Image!
    Ultima modifica di spino8; 03-07-2016 a 12:43

  10. #10
    Utente di HTML.it
    Registrato dal
    Oct 2014
    residenza
    Padova
    Messaggi
    361
    Quote Originariamente inviata da spino8 Visualizza il messaggio

    Ma le coordinate dopo come le prendo nel costruttore?
    Comunque l'ideale sarebbe rendere cliccabili i CircleElement...ancora meglio delle Image!
    Le coordinate le prendi esattamente come fai adesso, solo che aggiungi un unico MouseAdapter al pannello e non uno per ogni circleElement come fai adesso (e tra l'altro ora ne aggiungi n ad ogni volta che il metodo paintComponent viene richiamato, come detto non va affatto bene).

    Ora utilizzi un unico ciclo all'interno del paintComponent : per ogni circleElement effettui il disegno, e poi aggiungi al pannello un mouseListener che usa le "x" e "y" del circleElement che leggi nel ciclo esterno.

    Devi cambiare questa parte: nel paintComponent rimuovi la parte relativa al mouseListener, e lo aggiungi una sola volta al pannello.
    All'interno del mousePressed farai un nuovo ciclo in cui per ogni circleElement leggi la x e la y ed effettui quel controllo per vedere se il punto è compreso all'interno.

    Se vuoi fare il controllo usando lo stesso circleElement invece che l'immagine, va bene, ma finché usi un rettangolo o un cerchio è facile controllare se il punto è all'interno, se la forma geometrica è più complessa ovviamente aumenta anche la complessità di questa parte.
    Per un cerchio basta controllare se la distanza del punto cliccato dal centro del circleElement è minore o meno del raggio...

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.