Compilação

1 resposta
X

Pessoal, bom dia.

Quando uma classe.java é compilada, é criado classe.class
Quando uma classe.java possui "subclasses" classes internas a essa classe, é criado classe$arquivoInterno.class, classe$arquivoInterno2.class...
Mas caí em uma situação que não compreendo. Código abaixo.

package davmail.tray;

import davmail.Settings;
import davmail.ui.AboutFrame;
import davmail.ui.SettingsFrame;
import org.apache.log4j.Logger;
import org.apache.log4j.Priority;
import org.apache.log4j.lf5.LF5Appender;
import org.apache.log4j.lf5.LogLevel;
import org.apache.log4j.lf5.viewer.LogBrokerMonitor;

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

/**
 * Tray icon handler based on java 1.6
 */
public class AwtGatewayTray implements DavGatewayTrayInterface {
    protected AwtGatewayTray() {
    }

    private static TrayIcon trayIcon = null;
    private static Image image = null;
    private static Image image2 = null;
    private static Image inactiveImage = null;
    private boolean isActive = true;

    public Image getFrameIcon() {
        return image;
    }

    public void switchIcon() {
        isActive = true;
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                if (trayIcon.getImage() == image) {
                    trayIcon.setImage(image2);
                } else {
                    trayIcon.setImage(image);
                }
            }
        });
    }

    public void resetIcon() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                trayIcon.setImage(image);
            }
        });
    }

    public void inactiveIcon() {
        isActive = false;
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                trayIcon.setImage(inactiveImage);
            }
        });
    }

    public boolean isActive() {
        return isActive;
    }

    public void displayMessage(final String message, final Priority priority) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
            if (trayIcon != null) {
                TrayIcon.MessageType messageType = null;
                if (priority == Priority.INFO) {
                    messageType = TrayIcon.MessageType.INFO;
                } else if (priority == Priority.WARN) {
                    messageType = TrayIcon.MessageType.WARNING;
                } else if (priority == Priority.ERROR) {
                    messageType = TrayIcon.MessageType.ERROR;
                }
                if (messageType != null) {
                    trayIcon.displayMessage("DavMail gateway", message, messageType);
                }
                trayIcon.setToolTip("DavMail gateway \n" + message);
            }
            }
        });
    }

    public void init() {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }

    

    protected void createAndShowGUI() {
        // set native look and feel
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (Exception e) {
            DavGatewayTray.warn("Unable to set system look and feel", e);
        }

        // get the SystemTray instance
        SystemTray tray = SystemTray.getSystemTray();
        image = DavGatewayTray.loadImage("tray.png");
        image2 = DavGatewayTray.loadImage("tray.png");
        inactiveImage = DavGatewayTray.loadImage("trayinactive.png");

        // create a popup menu
        PopupMenu popup = new PopupMenu();

        final AboutFrame aboutFrame = new AboutFrame();
        // create an action settingsListener to listen for settings action executed on the tray icon
        ActionListener aboutListener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                aboutFrame.update();
                aboutFrame.setVisible(true);
            }
        };
        // create menu item for the default action
        MenuItem aboutItem = new MenuItem("About...");
        aboutItem.addActionListener(aboutListener);
        popup.add(aboutItem);

        final SettingsFrame settingsFrame = new SettingsFrame();
        // create an action settingsListener to listen for settings action executed on the tray icon
        ActionListener settingsListener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                settingsFrame.reload();
                settingsFrame.setVisible(true);
            }
        };
        // create menu item for the default action
        MenuItem defaultItem = new MenuItem("Settings...");
        defaultItem.addActionListener(settingsListener);
        popup.add(defaultItem);

        MenuItem logItem = new MenuItem("Show logs...");
        logItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                Logger rootLogger = Logger.getRootLogger();
                LF5Appender lf5Appender = (LF5Appender) rootLogger.getAppender("LF5Appender");
                if (lf5Appender == null) {
                    lf5Appender = new LF5Appender(new LogBrokerMonitor(LogLevel.getLog4JLevels()) {
                        protected void closeAfterConfirm() {
                            hide();
                        }
                    });
                    lf5Appender.setName("LF5Appender");
                    rootLogger.addAppender(lf5Appender);
                }
                lf5Appender.getLogBrokerMonitor().show();
            }
        });
        popup.add(logItem);

        // create an action exitListener to listen for exit action executed on the tray icon
        ActionListener exitListener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                SystemTray.getSystemTray().remove(trayIcon);
                //noinspection CallToSystemExit
                System.exit(0);
            }
        };
        // create menu item for the exit action
        MenuItem exitItem = new MenuItem("Exit");
        exitItem.addActionListener(exitListener);
        popup.add(exitItem);

        /// ... add other items
        // construct a TrayIcon
        trayIcon = new TrayIcon(image, "DavMail Gateway", popup);
        // set the TrayIcon properties
        trayIcon.addActionListener(settingsListener);
        // ...
        // add the tray image
        try {
            tray.add(trayIcon);
        } catch (AWTException e) {
            DavGatewayTray.warn("Unable to create tray", e);
        }

        // display settings frame on first start
        if (Settings.isFirstStart()) {
            settingsFrame.setVisible(true);
        }
    }
}

Compilando essa classe, é criado AwtGatewayTray.class, AwtGatewayTray$1.class, AwtGatewayTray$2.class ...
Alguém saberia me explicar por que? o que leva o compilador a criar esses arquivos?

Agradeço desde já.

1 Resposta

E

SuaClasse$N.class, onde N é um número, denota uma classe anônima. Quando você escreve

SwingUtilities.invokeLater(new Runnable() {  
            public void run() {  
                if (trayIcon.getImage() == image) {  
                    trayIcon.setImage(image2);  
                } else {  
                    trayIcon.setImage(image);  
                }  
            }  
        });

você está criando uma classe anônima que implementa java.lang.Runnable e cujo método run é esse que está entre chaves.

Criado 28 de junho de 2013
Ultima resposta 28 de jun. de 2013
Respostas 1
Participantes 2