Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802

    [ClassLoader]: istanziare una classe per fare l'override di alcuni suoi metodi

    'sera a tutti

    Dovrei fare in modo che una certa classe venga caricata solo se il programma è in esecuzione su Mac OS X. In particolare quello che vorrei fare è "convertire" questo codice

    codice:
        if (OS.isMacOSX()) {
                com.apple.eawt.Application application = com.apple.eawt.Application.getApplication();
    
                application.addAboutMenuItem();
                application.setEnabledAboutMenu(true);
    
                application.addApplicationListener(new com.apple.eawt.ApplicationAdapter() {
                    @Override
                    public void handleAbout(com.apple.eawt.ApplicationEvent e) {
                        aboutDialog.setVisible(true);
                        e.setHandled(true);
                    }
    
                    @Override
                    public void handleQuit(com.apple.eawt.ApplicationEvent e) {
                        exitAerocut();
                    }
                });
        }
    in modo che su Windows non dia problemi (infatti, anche se il codice con la classe com.apple.eawt.Application non verrà mai eseguito, la classe viene pre-caricata lo stesso).

    Quello che ho in mente si può fare? :master:

    Io ho iniziato così:

    ClassLoader cl = ClassLoader.getSystemClassLoader();
    Object applicationObject = cl.loadClass("com.apple.eawt.Application").newInst ance()

    Ora, come posso aggiungere l'ApplicationListener? :master:

    Grazie
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Sto provando ad usare Method:

    codice:
                    ClassLoader cl = ClassLoader.getSystemClassLoader();
    ...
                    Class applicationAdapter = cl.loadClass("com.apple.eawt.ApplicationAdapter");
                    Class applicationEvent = cl.loadClass("com.apple.eawt.ApplicationEvent");
                    
                    Object applicationAdapterObject = applicationAdapter.newInstance();
                    
                    Method handleQuitMethod = applicationAdapter.getMethod("handleQuit", applicationEvent);
    Ma ora, come faccio a dare un corpo personalizzato a questo metodo?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Risolto!

    Ho usato una "classe bridge" e ho richiamato quella

    codice:
            if (OS.isMacOSX()) {
                try {
                    ClassLoader cl = ClassLoader.getSystemClassLoader();
                    Class macBridgeClass = cl.loadClass("Aerocut.MacBridge");
    
                    Method addApplicationListenerMethod = macBridgeClass.getMethod(
                            "addApplicationListener");
                    addApplicationListenerMethod.invoke(macBridgeClass.newInstance());
                } catch (Exception ex) {
                    System.err.println(ex);
                }
           }
    codice:
    package Aerocut;
    
    import com.apple.eawt.Application;
    import com.apple.eawt.ApplicationAdapter;
    import com.apple.eawt.ApplicationEvent;
    
    /**
     * This class is loaded dynamically only on Mac OS X.
     * 
     * @author Alessandro Cocco
     */
    public class MacBridge {
    
        /**
         * Add ApplicationListener to Aerocut.
         */
        public static void addApplicationListener() {
            Application application = Application.getApplication();
            application.addApplicationListener(new ApplicationAdapter() {
    
                @Override
                public void handleQuit(ApplicationEvent e) {
                    State.getState().exitAerocut();
                }
            });
        }
    }
    Grazie lo stesso
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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.