Visualizzazione dei risultati da 1 a 9 su 9

Discussione: JComboBox

  1. #1

    JComboBox

    Prima vorrei ringraziare tutti quelli che in questi giorni mi hanno aiutato ......

    La mia domanda è la seguente : Ho una combo box con caricate un po di stringhe

    ora facendo click su una stringa questa l'ho fatta visualizzare dentro una JLabel .

    Quello che vorrei fare e che semplicemente quando passo sopra l'elemento della combobox mi si visualizzi senza cliccarci sopra . Come faccio ?

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

    Re: JComboBox

    Originariamente inviato da kerbero1984
    Quello che vorrei fare e che semplicemente quando passo sopra l'elemento della combobox mi si visualizzi senza cliccarci sopra . Come faccio ?
    Qui si dovrebbe precisare. La combobox fa aprire una lista (a discesa) e in questa lista puoi scegliere una voce tramite tastiera o mouse. Se ti muovi con le frecce della tastiera, cambi la selezione, quindi gli ActionListener/ItemListener registrati ovviamente vengono notificati. Se invece semplicemente "passi" con il cursore del mouse sopra gli elementi, no. Non è un cambio di selezione (lo è poi al "click" col mouse!).

    Se a te interessa "passare" sopra con il mouse su un elemento e sapere appunto su quale elemento sei (per fare quello che vuoi) ... devo dire che quasi sicuramente non è possibile.
    Ma è dovuto a come è implementato JComboBox. La lista a discesa la crea lui e non c'è modo (almeno a me non pare) per avere il riferimento a questa lista. Pertanto non si possono registrare listener su questa lista e quindi non si può fare qualcosa solo al passaggio sopra con il mouse.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie in effetti dubitavo ... no io ci devo passare sopra con il mouse

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    In realtà una soluzione sporca ci sarebbe: implementare un ListCellRenderer che, al passaggio del mouse, richiama un metodo:

    codice:
    class MioRenderer extends JLabel implements ListCellRenderer {
    
       public Component getListCellRendererComponent(JList list, Object value, int index, boolean sel, boolean focus) {
          setText( value.toString() );
          setOpaque( true );
          setForeground(sel || focus ? Color.white : Color.black);
          setBackground(sel || focus ? Color.blue.darker() : Color.white);
          if ( sel ) stampa( this );
          return this;
       }
    }
    Questo è un esempio banale (e presuppone che la classe sia interna a quella dove viene costruito il JComboBox, ma poco cambia): il mio ListCellRenderer è rappresentato da una JLabel. Nel momento in cui il valore sel è true, significa che la "cella" è selezionata (per il passaggio del mouse o perchè con i tasti direzionali si è selezionata la voce desiderata).

    Il metodo stampa() ottiene la JLabel relativa e ne fa ciò che vuole (quindi, può stamparne il contenuto da qualche parte, ecc).

    Al momento della costruzione del JComboBox si imposta questo renderer:
    codice:
    JComboBox jcb = new JComboBox( ... );
    jcb.setRenderer( new MioRenderer() );

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da LeleFT
    implementare un ListCellRenderer che, al passaggio del mouse, richiama un metodo
    Direi proprio di no. Il renderer ha come compito principale quello di fornire un Component e quest'ultimo viene letteralmente "stampato" a video nella cella. Vuol dire che nella lista a video non ci sono e non rimangono "componenti" veri e propri per gli elementi! Quindi pertanto non si possono ricevere notifiche dalle celle.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da andbin
    Direi proprio di no. Il renderer ha come compito principale quello di fornire un Component e quest'ultimo viene letteralmente "stampato" a video nella cella. Vuol dire che nella lista a video non ci sono e non rimangono "componenti" veri e propri per gli elementi! Quindi pertanto non si possono ricevere notifiche dalle celle.
    Infatti, ho precisato che si tratta di una soluzione sporca... usare la notifica del Renderer del fatto che una cella è selezionata per fare qualcos'altro...

    Non è né corretto da un punto di vista concettuale, né elegante, ma funziona.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da LeleFT
    usare la notifica del Renderer del fatto che una cella è selezionata per fare qualcos'altro...
    Scusa Lele ma io non capisco come potrebbe funzionare .... kerbero1984 ha detto che dovrebbe, in teoria, semplicemente sentire il "passaggio" del mouse (non il click) sopra le celle. Anche se ci fosse un renderer custom per le celle, innanzitutto la sequenza e i tempi con cui la lista "rinfresca" le celle (cioè chiede il Component e lo "stampa") è a sua discrezione.
    Ma in ogni caso non centra nulla con il "passaggio" del mouse.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class MouseCombo extends JFrame {
       private class MioRenderer extends JLabel implements ListCellRenderer {
    
          public Component getListCellRendererComponent(JList list, Object value, int index, boolean sel, boolean focus) {
             setText( value.toString() );
             setOpaque( true );
             setForeground(sel || focus ? Color.white : Color.black);
             setBackground(sel || focus ? Color.blue.darker() : Color.white);
             if ( sel ) stampa( this );
             return this;
          }
       }
    
       private JComboBox jcb;
       private JLabel lbl;
       private String[] oggetti = {"Primo nella lista", "Secondo nella lista", "Terzo nella lista", "Quarto nella lista"};
    
       public MouseCombo() {
          Container c = getContentPane();
          c.setLayout( new BorderLayout() );
    
          lbl = new JLabel("Quando il mouse si muoverà, qui comparirà l'oggetto selezionato");
          jcb = new JComboBox( oggetti );
          jcb.setRenderer( new MioRenderer() );
    
          c.add(lbl, BorderLayout.NORTH);
          c.add(jcb, BorderLayout.SOUTH);
    
          setSize(200, 200);
          setTitle("Prova Renderer");
          setDefaultCloseOperation( EXIT_ON_CLOSE );
          setVisible( true );
       }
    
       public void stampa(JLabel l) {
          lbl.setText("Mouse sopra: " + l.getText());
       }
    
       public static void main(String[] args) {
          MouseCombo mc = new MouseCombo();
       }
    }
    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Sì, è vero. Ero in errore io perché stavo pensando e avevo in mente un "normale" JList, dove il solo passaggio del mouse non cambia proprio nulla nella lista visivamente. Ma la lista drop-down di un "combo box" (parlando in generale, non solo in Java) è gestita in genere diversamente, cioè c'è un cambio di stato visuale muovendosi con il mouse tra gli elementi.
    E in Java con un renderer è chiaro che esso viene invocato ed usato!!
    Quindi sì, in questo caso una notifica si può fare, anche se concordo perfettamente con te che è una soluzione abbastanza "tirata" e non proprio "pulita".
    Sorry per la mia svista.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.