Variavel final

10 respostas
pro_websis

Olá pessoal preciso de uma ajudinha de vcs, seguinte tenho uma classe para criar tray icon chamada TrayIcon ai no metodo createAndShowGUI para criação do tray icon eu tenho o seguinte

final TrayIcon obTrayIcon = new TrayIcon(createImage("images/bulb.gif", "tray icon"));

bom a pergunta eh como posso alterar esse objeto obTrayIcon de outra classe? tenho uma classe principal ai eu chamo a classe para criação do tray icon >>>

tray = new TrayIcon();
         
tray.createAndShowGUI();

penso eu q para alterar o tray icon eu teria que criar um método na classe TrayIcon para alterar o objeto obTrayIcon certo?
masss não sei como fazer alguém pode me ajudar, já tentei de muitas formas…

valeu

10 Respostas

K

sou iniciante em java, mas se nao me engano final define que a variável não pode ser alterada, não eh?

gabrielmassote

isso ae…

uma vez criado nao pode ser alterado…qualquer variavel final nao pode ser alterada…

ricoldi

Bom na minha opnião se vc tem uma classe separada para o seu trayicon, seria interessante vc usar Singleton, que faz vc ter uma só instancia deste objeto, onde vc cria um metodo estatico que quando chamado retorna a instancia deste objeto.

mas se for só um objeto de outra classe ai é só static

Wiki Singleton

http://pt.wikipedia.org/wiki/Singleton

GUJ Singleton

http://www.guj.com.br/jforum.java?module=search&action=search&search_keywords=singleton&match_type=all&search_forum=&sort_by=relevance

Att,
Ricoldi

pro_websis

Bom já estou pesquisando sobre Singleton, como o vc disse (ricold) o singleton retorna a instancia desse objeto mas eu queria criar um método dentro da classe trayIcon para alterar o objeto, mais nesse caso eu não poderia ultilizar o final TrayIcon, tem como trocar final por string alguma outra coisa do tipo para alterar esse objeto de uma outra classe?

ricoldi

Bom imaginando que vc tenha uma classe que manipule o trayicon exemplo:

public class myTrayIcon{

    public static getInstance(){
    ... //Implementação do singleton
    }

    public void setIcon(Image _imagem){
    ...
    }

    public void setText(String _texto){
    ...
    }

}

Deste modo sempre que for manipular seu objeto trayicon vc usa o metodo estatico para pegar o objeto instanciado e apartir dele você manipula o mesmo.

Encapsulamento, manja?

Att
Ricoldi

pro_websis

Bom kra valeu pela ajuda mais preciso de mais uma ajudinha pesquisei sobre singueton mais ainda não sei como vou implementar esse metodo static getInstance() no caso dessa classe, os exemplos de singleton eh diferente dessa classe de uma olhada >>>>

package Agenda;  
/*
 * TrayIconDemo.java
 */

import java.awt.*;
import java.awt.event.*;
import java.net.URL;
import javax.swing.*;

public class TrayIconDemo {
    
    public static void main(String[] args) {
        
       // JOptionPane.showMessageDialog(null, "vai passar !!!");
        
        /* Use an appropriate Look and Feel */
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
            //UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
        } catch (UnsupportedLookAndFeelException ex) {
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        } catch (InstantiationException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        /* Turn off metal's use of bold fonts */
        UIManager.put("swing.boldMetal", Boolean.FALSE);
        //Schedule a job for the event-dispatching thread:
        //adding TrayIcon.
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
    
    public static void createAndShowGUI() {
        //Check the SystemTray support
        if (!SystemTray.isSupported()) {
            System.out.println("SystemTray is not supported");
            return;
        }
        final PopupMenu popup = new PopupMenu();
        
        //            esse eh o objeto que quero modificar
        final TrayIcon trayIcon = new TrayIcon(createImage("images/bulb.gif", "tray icon"));
        
        final SystemTray tray = SystemTray.getSystemTray();
        
        // Create a popup menu components
        MenuItem aboutItem = new MenuItem("About");
        CheckboxMenuItem cb1 = new CheckboxMenuItem("Set auto size");
        CheckboxMenuItem cb2 = new CheckboxMenuItem("Set tooltip");
        Menu displayMenu = new Menu("Display");
        MenuItem errorItem = new MenuItem("Error");
        MenuItem warningItem = new MenuItem("Warning");
        MenuItem infoItem = new MenuItem("Info");
        MenuItem noneItem = new MenuItem("None");
        MenuItem exitItem = new MenuItem("Exit");
        
        //Add components to popup menu
        popup.add(aboutItem);
        popup.addSeparator();
        popup.add(cb1);
        popup.add(cb2);
        popup.addSeparator();
        popup.add(displayMenu);
        displayMenu.add(errorItem);
        displayMenu.add(warningItem);
        displayMenu.add(infoItem);
        displayMenu.add(noneItem);
        popup.add(exitItem);
        
        trayIcon.setPopupMenu(popup);

        trayIcon.setImageAutoSize(true);
                
        
        try {
            tray.add(trayIcon);
        } catch (AWTException e) {
            System.out.println("TrayIcon could not be added.");
            return;
        }
        
        trayIcon.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null,
                        "This dialog box is run from System Tray");
            }
        });
        
        aboutItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                JOptionPane.showMessageDialog(null,
                        "This dialog box is run from the About menu item");
            }
        });
        
        cb1.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                int cb1Id = e.getStateChange();
                if (cb1Id == ItemEvent.SELECTED){
                    trayIcon.setImageAutoSize(true);
                } else {
                    trayIcon.setImageAutoSize(false);
                }
            }
        });
        
        cb2.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent e) {
                int cb2Id = e.getStateChange();
                if (cb2Id == ItemEvent.SELECTED){
                    trayIcon.setToolTip("Sun TrayIcon");
                } else {
                    trayIcon.setToolTip(null);
                }
            }
        });
        
        ActionListener listener = new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                MenuItem item = (MenuItem)e.getSource();
                //TrayIcon.MessageType type = null;
                System.out.println(item.getLabel());
                if ("Error".equals(item.getLabel())) {
                    //type = TrayIcon.MessageType.ERROR;
                   
                } else if ("Warning".equals(item.getLabel())) {
                    //type = TrayIcon.MessageType.WARNING;
                    trayIcon.displayMessage("Sun TrayIcon Demo",
                            "Essa é uma mensagem de perigo!!!", TrayIcon.MessageType.WARNING);
                    
                } else if ("Info".equals(item.getLabel())) {
                    //type = TrayIcon.MessageType.INFO;
                    trayIcon.displayMessage("Sun TrayIcon Demo",
                            "This is an info message", TrayIcon.MessageType.INFO);
                    
                } else if ("None".equals(item.getLabel())) {
                    //type = TrayIcon.MessageType.NONE;
                    trayIcon.displayMessage("Sun TrayIcon Demo",
                            "This is an ordinary message", TrayIcon.MessageType.NONE);
                }
            }
        };
        
        errorItem.addActionListener(listener);
        warningItem.addActionListener(listener);
        infoItem.addActionListener(listener);
        noneItem.addActionListener(listener);
        
        exitItem.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                tray.remove(trayIcon);
                System.exit(0);
            }
        });
    }   
    
    //Obtain the image URL
    protected static Image createImage(String path, String description) {
        URL imageURL = TrayIconDemo.class.getResource(path);
        
        if (imageURL == null) {
            System.err.println("Resource not found: " + path);
            return null;
        } else {
            return (new ImageIcon(imageURL, description)).getImage();
        }
    }
}
ViniGodoy

O único problema é que Singletons não funcionam em Java:

  1. Por causa da reflexão;
  2. Por causa da possibilidade de haver multiplos classloaders;
  3. Se usar lazy-initialization, porque é difícil torna-lo thread-safe.

Só use se sua aplicação for realmente simples.

pro_websis

ueh, como eu poderia fazer no meu caso então ? se eu colocar esse codigo junto a classe principal vai ficar muito grande

pro_websis

Bom pessoal seguinte consegui criar um método para alterar o objeto tray icon, eh na verdade não tah alterando tah duplicando mais aparece a mensagem no balãozinho apartir de outros metodo da minha classe principal seguinte deem uma olhada no q eu fiz

public static TrayIcon trayIcon;

    // método para alterar a mensagem do balão no trayicon
    public void msgTray(String d, String texto) { 
      
        this.trayIcon.displayMessage(d, texto, TrayIcon.MessageType.WARNING);
    }
    
    public static void main(String[] args) {
        
       // JOptionPane.showMessageDialog(null, "vai passar !!!");
        
        /* Use an appropriate Look and Feel */
        try {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
            //UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
        } catch (UnsupportedLookAndFeelException ex) {
            ex.printStackTrace();
        } catch (IllegalAccessException ex) {
            ex.printStackTrace();
        } catch (InstantiationException ex) {
            ex.printStackTrace();
        } catch (ClassNotFoundException ex) {
            ex.printStackTrace();
        }
        /* Turn off metal's use of bold fonts */
        UIManager.put("swing.boldMetal", Boolean.FALSE);
        //Schedule a job for the event-dispatching thread:
        //adding TrayIcon.
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
    
    public static void createAndShowGUI() {
        //Check the SystemTray support
        if (!SystemTray.isSupported()) {
            System.out.println("SystemTray is not supported");
            return;
        }
        final PopupMenu popup = new PopupMenu();
       
        //  tirei o final como estava e declarei lá em cima como public static
        //  e criei o metodo msgTray para setar a mensagem
        trayIcon = new TrayIcon(createImage("images/bulb.gif", "tray icon"));

        final SystemTray tray = SystemTray.getSystemTray();
        
        ..........................  restante da classe  .............................

agora soh falta parar de duplicar o trayicon alguem sabe me dizer pq tah duplicando o tray???
valeu

ricoldi

pro_websis, a ideia é usar o singleton para dentro do programa vc não ter mais que uma instancia da classe trayicon, exatamente por isso cada vez que vc constroi um objeto desta classe ele vai lá e cria um novo icone no tray e suas referencias vão ficar cada vez em um icone do tray.

O que falei sobre encapsulamento é vc separar tudo que é do trayicon, criar uma classe para manipular ele. e não deixar tudo junto numa classe só entende?

Quando separar as classes ai vai ver como é facil colocar um getInstance() lá…

Faz isso separa as classes ai tenta colocar o getInstace(), se precisar fala aí…

Att
Ricoldi;

Criado 2 de julho de 2008
Ultima resposta 4 de jul. de 2008
Respostas 10
Participantes 5