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

    Problema Popup con nuovo Look & Feel

    Ciao a tutti
    ho un problema col mio programma.


    Ho un JDesktopPane che contiene dei JInternalFrame che si aprono da un JMenuBar nella parte superiore.


    Ho impostato inizialmente il look and feel "Nimbus" all'applicativo, ma può essere sostituito in base ad una mia scelta con alcuni L&F scaricati oppure quelli di sistema.


    Il tutto funziona correttamente, tranne che per una piccola cosa che non riesco a capire.

    Nel JDesktopPane ho realizzato un Listener, non appena clicco col tasto destro sopra il JDesktopPane viene aperto una piccolo popup per il cambiamento della immagine di sfondo.
    Se il Look&Feel rimane come quello applicato all'inizio allora non vi è alcun problema e posso applicare tutti i cambiamenti che avevo sviluppato


    Invece dopo aver cambiato, non appena faccio click col tasto destro e mi parte un eccezione di NullPointerException che riporto di seguito:


    codice:
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        at sun.font.FontDesignMetrics$MetricsKey.init(Unknown Source)
        at sun.font.FontDesignMetrics.getMetrics(Unknown Source)
        at sun.swing.SwingUtilities2.getFontMetrics(Unknown Source)
        at javax.swing.JComponent.getFontMetrics(Unknown Source)
        at sun.swing.MenuItemLayoutHelper.reset(Unknown Source)
        at javax.swing.plaf.synth.SynthMenuItemLayoutHelper.<init>(Unknown Source)
        at javax.swing.plaf.synth.SynthGraphicsUtils.getPreferredMenuItemSize(Unknown Source)
        at javax.swing.plaf.synth.SynthMenuItemUI.getPreferredMenuItemSize(Unknown Source)
        at javax.swing.plaf.basic.BasicMenuItemUI.getPreferredSize(Unknown Source)
        at javax.swing.JComponent.getPreferredSize(Unknown Source)
        at javax.swing.BoxLayout.checkRequests(Unknown Source)
        at javax.swing.BoxLayout.preferredLayoutSize(Unknown Source)
        at javax.swing.plaf.synth.DefaultMenuLayout.preferredLayoutSize(Unknown Source)
        at java.awt.Container.preferredSize(Unknown Source)
        at java.awt.Container.getPreferredSize(Unknown Source)
        at javax.swing.JComponent.getPreferredSize(Unknown Source)
        at javax.swing.JPopupMenu.adjustPopupLocationToFitScreen(Unknown Source)
        at javax.swing.JPopupMenu.getPopup(Unknown Source)
        at javax.swing.JPopupMenu.setVisible(Unknown Source)
        at javax.swing.JPopupMenu.show(Unknown Source)
        at com.sport.listener.BackImageDesktopFrame.showPopup(BackImageDesktopFrame.java:131)
        at com.sport.listener.BackImageDesktopFrame.mouseReleased(BackImageDesktopFrame.java:125)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at javax.swing.JComponent.processMouseEvent(Unknown Source)
        etc etc....
        ...
        ...



    Non riesco a capire a cosa si riferisce il NullPointerException visto che non è nulla che appartiene a quello da me sviluppato


    Quello che faccio per applicare il L&F è il seguente:


    codice:
    
        try {
            UIManager.setLookAndFeel(UIManager.getInstalledLookAndFeels()[choose].getClassName());
            SwingUtilities.updateComponentTreeUI(this);    
        } 
            catch (ClassNotFoundException e) {
            e.printStackTrace();
        } 
            catch (InstantiationException e) {
            e.printStackTrace();
        } 
            catch (IllegalAccessException e) {
            e.printStackTrace();
        } 
            catch (UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }         
        catch (Exception e) {
             e.printStackTrace();
        }

    Nel try faccio la scelta dell' L&F (le ho installate precedentemente), e poi la applico a tutte le UI come ho fatto in altre occasioni.

    Se vi serve qualche altra info fatemi sapere.

    Grazie.
    Ciao.
    Ultima modifica di schumy2000; 10-03-2014 a 13:38
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da schumy2000 Visualizza il messaggio
    codice:
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
        [ ... ]
        at javax.swing.JPopupMenu.adjustPopupLocationToFitScreen(Unknown Source)
        at javax.swing.JPopupMenu.getPopup(Unknown Source)
        at javax.swing.JPopupMenu.setVisible(Unknown Source)
        at javax.swing.JPopupMenu.show(Unknown Source)
        at com.sport.listener.BackImageDesktopFrame.showPopup(BackImageDesktopFrame.java:131)
        at com.sport.listener.BackImageDesktopFrame.mouseReleased(BackImageDesktopFrame.java:125)
        at java.awt.Component.processMouseEvent(Unknown Source)
        at javax.swing.JComponent.processMouseEvent(Unknown Source)

    Non riesco a capire a cosa si riferisce il NullPointerException visto che non è nulla che appartiene a quello da me sviluppato


    Quello che faccio per applicare il L&F è il seguente:

    codice:
        try {
            UIManager.setLookAndFeel(UIManager.getInstalledLookAndFeels()[choose].getClassName());
            SwingUtilities.updateComponentTreeUI(this);    
        }

    Nel try faccio la scelta dell' L&F (le ho installate precedentemente), e poi la applico a tutte le UI come ho fatto in altre occasioni.
    Dallo stack trace risulta che il problema è originato dallo "show" del JPopupMenu. A me viene un dubbio .... per verificarlo dovrei fare qualche prova ma di oggi non credo di avere tempo.

    Il mio dubbio è: il JPopupMenu come/quando lo crei e gestisci? Dallo stack trace mi sembra di capire che hai gestito la cosa a basso livello con gli eventi del mouse, in pratica alla "vecchia" maniera.

    Tieni anche presente che da Java 5 tutti i componenti Swing hanno setComponentPopupMenu. Questo non solo semplifica moltissimo la gestione del menù di popup (non devi più gestire alcun evento del mouse) ma è anche gestito nel updateComponentTreeUI, cioè se scansionando l'albero dei componenti trova che uno ha un menù di popup, invoca ulteriormente updateComponentTreeUI sul JPopupMenu.

    Se il JPopupMenu lo istanzi tu e te lo tieni in qualche variabile di istanza e poi lo mostri a "mano" con il suo show ..... beh, updateComponentTreeUI non può "sapere" del tuo JPopupMenu e quindi non può aggiornare la sua UI. Pertanto potrebbero esserci problemi. Di cui l'effetto potrebbe essere appunto quel NPE che viene lanciato.
    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 L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Esatto l'ho gestito alla "vecchia" maniera.

    Proverò con il setComponentPopupMenu mi leggero la documentazione e vedrò qualche banale esempio in modo tale da applicare il popup con tale procedura.

    Cmq per completezza ho provato ad impostare come L&F di avvio il Liquid (
    com.birosoft.liquid.LiquidLookAndFeel).
    MA con questo se vado a cambiare l'L&F non mi viene fuori alcun eccezione, invece a seconda della tua idea dovrebbe ugualmente spararmi l'NPE.

    Ti tengo aggiornato.

    Grazie mille.

    Ciao.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  5. #5
    Grazie mille Alex.
    Ho visto ma le spiegazioni che danno non mi portano alcuna miglioria.
    Ho provato anche il suggerimento di andbin, ma anche applicando la modifica del setComponentPopupMenu (che non conoscevo, è bellissimo ) si arriva alla solita eccezione.
    Ripeto: se applico all'inizio l' L&F Liquid o qualunque altro dei L&F non interni alla VM ma installati tramite i JAR non ho alcun problema anche se riapplico l' L&F Nimbus o Windows, il contrario mi da errore.

    E' davvero strano e mi fa pensare...

    @Edit: ho visto adesso che se imposto il "metal" all'inizio non ho alcun problema anche cambiando L&F...invece mettendo "Windows" in alcuni L&F vedo il popup con due immagini vicine come se vedessi doppio...il mistero si infittisce
    Ultima modifica di schumy2000; 10-03-2014 a 16:48
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  6. #6
    Alla luce di quello che ho scritto non c'è nessuna altra possibilità?
    devo necessariamente rimuovere il nimbus?

    Grazie,
    Ciao.
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da schumy2000 Visualizza il messaggio
    Alla luce di quello che ho scritto non c'è nessuna altra possibilità?
    devo necessariamente rimuovere il nimbus?
    Purtroppo è un po' difficile dire cosa non va esattamente e come rimediare. Una questione è quella di applicare il updateComponentTreeUI a tutta la tua interfaccia utente. Se usi setComponentPopupMenu anche i menù di popup vengono considerati in updateComponentTreeUI. Se il menù di popup lo gestisci tu "a mano" con eventi del mouse, dovresti applicare tu updateComponentTreeUI al tuo JPopupMenu.

    Ma tutto questo potrebbe anche non centrare nulla con il problema del NPE. Puoi eventualmente postare un codice di esempio, anche minimale, indicando bene quali L&F usi e da dove provengono (es. jar esterni) tale per cui dia l'errore?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Onestamente non mi sembra molto utile postare tutto il codice quando il problema è SOLO nel Nimbus ed solo se vado a cambiare il look e Feel dal Nimbus verso tutti gli altri...sicuramente ci sarà qualcosa gestita male e quindi non permette questa attività, visto che poi tutti gli altri Jar e i loro cambiamenti, da o verso un'altro L&F permettono correttamente la discesa del menù a tendina.
    La cosa strana è che sia uno dei L&F messi nella Java virtual Machine visto che non è molto stabile...
    Fare un esempio minimale secondo me non rende l'idea...
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

  9. #9
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da schumy2000 Visualizza il messaggio
    Onestamente non mi sembra molto utile postare tutto il codice quando il problema è SOLO nel Nimbus ed solo se vado a cambiare il look e Feel dal Nimbus verso tutti gli altri...
    Scusa ma riesci a fare un semplice sorgente in cui nel main imposti il Nimbus e poi apri un frame con un pulsantino che fa cambiare il L&F ad un altro tale da dare l'errore?
    In altre parole, riesci a fornire un codice per poter replicare il problema?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  10. #10
    Si che lo riesco a fare...il problema è che comunque bisogna perderci un po di tempo...
    appena trovo 5 minuti liberi provo a farlo

    P.S. il problema non è il cambio di L&F...è solo il menù a discesa.
    Il cambio di L&F non dà errori scusami ma l'avrò scritto cento volte ed anche tu mi hai fatto l'esempio....inoltre tutte le altre funzionalità fanno il loro dovere...
    Ultima modifica di schumy2000; 11-03-2014 a 13:49
    I computer sono incredibilmente veloci, accurati e stupidi.
    Gli uomini sono incredibilmente lenti, inaccurati e intelligenti.
    Insieme sono una potenza che supera l'immaginazione.

    A.Einstein

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.