Rendere una JComboBox inaccessibile

di il
10 risposte

Rendere una JComboBox inaccessibile

Buongiorno,

In una JFrame ho un JPanel contenente dei JTextField e JComboBox.
Avrei bisogno di inibire l'accesso a tutti i componenti a seconda della funzione attivata.
L'effetto ottenuto con il metodo:
NomeComboBox.setEnabled(false);
purtroppo è di scolorire le combo come succede con i JTextField, che è un effetto decisamente brutto.
Rendere il JPanel non Enabled non disabilita l'accesso ai componenti che contiene.

Per i campi di tipo JTextField ho risolto con:
NomeTextField.setEditable(false);
ma con le JComboBox non funziona.

Qualcuno gentilmente sa darmi una dritta?

10 Risposte

  • Re: Rendere una JComboBox inaccessibile

    ZioCrick ha scritto:


    L'effetto ottenuto con il metodo:
    NomeComboBox.setEnabled(false);
    purtroppo è di scolorire le combo come succede con i JTextField, che è un effetto decisamente brutto.
    Perché "brutto"? Dopotutto è quello che fanno tutti i software ....

    ZioCrick ha scritto:


    Rendere il JPanel non Enabled non disabilita l'accesso ai componenti che contiene.
    Appunto. Anche perché i JPanel di norma non ricevono input (a meno di fare setFocusable(true) per scenari davvero particolari).

    ZioCrick ha scritto:


    Qualcuno gentilmente sa darmi una dritta?
    Purtroppo non è affatto banale .... hai già provato a fare una ricerca?
  • Re: Rendere una JComboBox inaccessibile

    Ciao Andrea

    andbin ha scritto:


    Perché "brutto"? Dopotutto è quello che fanno tutti i software ....
    Perché c'è troppa differenza tra il nero del testo normale e il grigino dei testi disabilitati che quasi diventano invisibili, con un effetto veramente pessimo.
    Di fatto, non è come disabilitare una lista perché si vuole accedere ai dati di dettaglio e quindi la lista può anche diventare quasi invisibile.
    Qua voglio che i dati di dettaglio siano ben visibili mentre si scorre l'elenco principale, perché bisogna scegliere il record su cui intervenire con degli aggiornamenti/modifiche.
    In altre parole, è come avere la classica anagrafica dove nell'elenco principale compaiono solo i nomi e i cognomi e man mano che li scorri nel pannello sottostante vengono visualizzati i dati di dettaglio della persona e quindi devono essere ben visibili, ma non accessibili con il mouse o con il <TAB>
    Tra l'altro in VB6 c'era modo di rendere inaccessibile qualsiasi componente senza disabilitarlo, cosa che ho sempre usato a tappeto, mannaggia.

    andbin ha scritto:


    Purtroppo non è affatto banale .... hai già provato a fare una ricerca?
    Guarda, questo forum è la mia ultima spiaggia; non lo scrivo tutte le volte, ma quando arrivo a scrivere qui è perché le ho provate tutte (quelle che ho trovato) e sono alla canna del gas...
  • Re: Rendere una JComboBox inaccessibile

    ZioCrick ha scritto:


    Perché c'è troppa differenza tra il nero del testo normale e il grigino dei testi disabilitati che quasi diventano invisibili, con un effetto veramente pessimo.
    Un setFocusable(false) sui componenti impedisce il "focus" quindi l'input da tastiera. Ma ... purtroppo non impedisce eventi da mouse.

    E se una questione è il colore nei textfield disabled, nota che JTextComponent ha il setDisabledTextColor.

    Di altro non ho in mente nulla per ora ....
  • Re: Rendere una JComboBox inaccessibile

    andbin ha scritto:


    Un setFocusable(false) sui componenti impedisce il "focus" quindi l'input da tastiera. Ma ... purtroppo non impedisce eventi da mouse.
    Infatti, provato anche quello.

    andbin ha scritto:


    E se una questione è il colore nei textfield disabled, nota che JTextComponent ha il setDisabledTextColor.
    Questo non l'avevo scoperto, ma il mio problema sono le ComboBox, che ho appena verificato e non hanno il metodo setDisabledTextColor.
  • Re: Rendere una JComboBox inaccessibile

    ZioCrick ha scritto:


    il mio problema sono le ComboBox, che ho appena verificato e non hanno il metodo setDisabledTextColor.
    Vero. Però Swing si basa sui Look-and-Feel che tipicamente usano delle loro property "globali" gestite attraverso la classe UIManager.

    Quindi perlomeno se usi il L&F predefinito di Swing, allora prova:
    UIManager.put("ComboBox.disabledForeground", Color.BLACK);
    UIManager.put("ComboBox.disabledBackground", Color.WHITE);
    Da eseguire proprio all'inizio della tua applicazione una-tantum. Queste chiavi specifiche es. "ComboBox.disabledForeground" si trovano sia in documentazione varia (anche su certi libri su Swing) e anche dando una occhiata ai sorgenti del framework (come ho fatto io).
  • Re: Rendere una JComboBox inaccessibile

    andbin ha scritto:


    Quindi perlomeno se usi il L&F predefinito di Swing
    Si credo, anche perché non saprei nemmeno come usare qualcos'altro.

    andbin ha scritto:


    UIManager.put("ComboBox.disabledForeground", Color.BLACK);
    UIManager.put("ComboBox.disabledBackground", Color.WHITE);
    Grazie per l'indicazione.
    Ho posizionato le due istruzioni nel costruttore della form principale, ma non ha funzionato.
    Le ho posizionate nel costruttore della form specifica, ma non ha funzionato.
    Poi ho provato a modificare la voce ComboBox in JComboBox, ma non è cambiato nulla.
  • Re: Rendere una JComboBox inaccessibile

    ZioCrick ha scritto:


    Ho posizionato le due istruzioni nel costruttore della form principale, ma non ha funzionato.
    Le ho posizionate nel costruttore della form specifica, ma non ha funzionato.
    Poi ho provato a modificare la voce ComboBox in JComboBox, ma non è cambiato nulla.
    No, quelle chiavi sono giuste.

    Non è che stai usando il L&F chiamato "Nimbus"?? (https://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/nimbus.html)
    Guarda nel main() se c'è un UIManager.setLookAndFeel( ... )

    Quelle chiavi non valgono per il Nimbus. Ma può darsi che ci sia un equivalente. Bisognerebbe indagare ....
  • Re: Rendere una JComboBox inaccessibile

    andbin ha scritto:


    Non è che stai usando il L&F chiamato "Nimbus"?? (https://docs.oracle.com/javase/tutorial/uiswing/lookandfeel/nimbus.html)
    Guarda nel main() se c'è un UIManager.setLookAndFeel( ... )
    Andrea! te l'ho già detto altre volte... ma mi ripeto.. SEI UN MITO!!!!!
    Io manco sapevo dei diversi L&F...
    Ho verificato ed è vero! Nel main c'è questo ciclo:
    for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
      if ("Nimbus".equals(info.getName())) {
         javax.swing.UIManager.setLookAndFeel(info.getClassName());
         break;
      }
    } 
    
    Allora ho provato a commentarlo e magicamente le due istruzioni che mi hai indicato FUNZIONANO!

    A questo punto la mia curiosità è diventata incontenibile e siccome non sapevo che alternative c'erano, e nemmeno come si chiama il L&F predefinito di Swing, ho cercato nelle opzioni di NetBeans e nella voce Appearance c'è la tab Look and Feel c'è una Combo con la scritta Preferred look and feel nella quale è selezionata la voce Metal, quindi credo che, avendo tolto il ciclo nel main, usi quel L&F.
    Nella combo ci sono anche le voci Nimbus, CDE/Motif, GTK+.
    Ho fatto una rapida ricerca sul web e mi sembra di aver capito che il default per Swing sarebbe GTK+ ma ha delle incompatibilità tra le varie piattaforme, mentre il Metal è cross-piattaforma, quindi mi conviene usare quello, perché il mio programmino lo uso anche su Windows.
    E' corretto?
  • Re: Rendere una JComboBox inaccessibile

    ZioCrick ha scritto:


    Ho verificato ed è vero! Nel main c'è questo ciclo:
    for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
      if ("Nimbus".equals(info.getName())) {
         javax.swing.UIManager.setLookAndFeel(info.getClassName());
         break;
      }
    } 
    
    Ahhhh il Nimbus! La "solita" robbbbba generata da NetBeans!

    ZioCrick ha scritto:


    Nella combo ci sono anche le voci Nimbus, CDE/Motif, GTK+.
    Ho fatto una rapida ricerca sul web e mi sembra di aver capito che il default per Swing sarebbe GTK+ ma ha delle incompatibilità tra le varie piattaforme, mentre il Metal è cross-piattaforma, quindi mi conviene usare quello, perché il mio programmino lo uso anche su Windows. E' corretto?
    Il Metal è quello predefinito standard, perlomeno sui Windows (sui Linux non sono sicuro ma credo pure).
    Il CDE/Motif è bruttissimo (davvero...), roba preistorica ....
    Il Nimbus è più recente ed è quello un po' più fig... ehm carino.

    Poi c'è il "native" L&F che setti con:
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    Se possibile, emula l'aspetto del sistema su cui sta girando, anche se poi non lo fa al 100% perfetto.

    Li puoi enumerare tutti con quel getInstalledLookAndFeels().
  • Re: Rendere una JComboBox inaccessibile

    andbin ha scritto:


    Ahhhh il Nimbus! La "solita" robbbbba generata da NetBeans!
    Eh, io purtroppo, da super principiante in Java, ho pensato di appoggiarmi a NetBeans sperando mi rendesse la vita più facile, se non altro nella creazione delle interfacce grafiche.

    andbin ha scritto:


    Il Metal è quello predefinito standard, perlomeno sui Windows (sui Linux non sono sicuro ma credo pure).
    ...
    Li puoi enumerare tutti con quel getInstalledLookAndFeels().
    Grazie mille ancora per le tue preziose indicazioni.
    Farò un po di prove.
Devi accedere o registrarti per scrivere nel forum
10 risposte