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
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=newTrayIcon();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…
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
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:
publicclassmyTrayIcon{publicstaticgetInstance(){...//Implementação do singleton}publicvoidsetIcon(Image_imagem){...}publicvoidsetText(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 >>>>
packageAgenda;/* * TrayIconDemo.java */importjava.awt.*;importjava.awt.event.*;importjava.net.URL;importjavax.swing.*;publicclassTrayIconDemo{publicstaticvoidmain(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(UnsupportedLookAndFeelExceptionex){ex.printStackTrace();}catch(IllegalAccessExceptionex){ex.printStackTrace();}catch(InstantiationExceptionex){ex.printStackTrace();}catch(ClassNotFoundExceptionex){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(newRunnable(){publicvoidrun(){createAndShowGUI();}});}publicstaticvoidcreateAndShowGUI(){//Check the SystemTray supportif(!SystemTray.isSupported()){System.out.println("SystemTray is not supported");return;}finalPopupMenupopup=newPopupMenu();// esse eh o objeto que quero modificarfinalTrayIcontrayIcon=newTrayIcon(createImage("images/bulb.gif","tray icon"));finalSystemTraytray=SystemTray.getSystemTray();// Create a popup menu componentsMenuItemaboutItem=newMenuItem("About");CheckboxMenuItemcb1=newCheckboxMenuItem("Set auto size");CheckboxMenuItemcb2=newCheckboxMenuItem("Set tooltip");MenudisplayMenu=newMenu("Display");MenuItemerrorItem=newMenuItem("Error");MenuItemwarningItem=newMenuItem("Warning");MenuIteminfoItem=newMenuItem("Info");MenuItemnoneItem=newMenuItem("None");MenuItemexitItem=newMenuItem("Exit");//Add components to popup menupopup.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(AWTExceptione){System.out.println("TrayIcon could not be added.");return;}trayIcon.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){JOptionPane.showMessageDialog(null,"This dialog box is run from System Tray");}});aboutItem.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){JOptionPane.showMessageDialog(null,"This dialog box is run from the About menu item");}});cb1.addItemListener(newItemListener(){publicvoiditemStateChanged(ItemEvente){intcb1Id=e.getStateChange();if(cb1Id==ItemEvent.SELECTED){trayIcon.setImageAutoSize(true);}else{trayIcon.setImageAutoSize(false);}}});cb2.addItemListener(newItemListener(){publicvoiditemStateChanged(ItemEvente){intcb2Id=e.getStateChange();if(cb2Id==ItemEvent.SELECTED){trayIcon.setToolTip("Sun TrayIcon");}else{trayIcon.setToolTip(null);}}});ActionListenerlistener=newActionListener(){publicvoidactionPerformed(ActionEvente){MenuItemitem=(MenuItem)e.getSource();//TrayIcon.MessageType type = null;System.out.println(item.getLabel());if("Error".equals(item.getLabel())){//type = TrayIcon.MessageType.ERROR;}elseif("Warning".equals(item.getLabel())){//type = TrayIcon.MessageType.WARNING;trayIcon.displayMessage("Sun TrayIcon Demo","Essa é uma mensagem de perigo!!!",TrayIcon.MessageType.WARNING);}elseif("Info".equals(item.getLabel())){//type = TrayIcon.MessageType.INFO;trayIcon.displayMessage("Sun TrayIcon Demo","This is an info message",TrayIcon.MessageType.INFO);}elseif("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(newActionListener(){publicvoidactionPerformed(ActionEvente){tray.remove(trayIcon);System.exit(0);}});}//Obtain the image URLprotectedstaticImagecreateImage(Stringpath,Stringdescription){URLimageURL=TrayIconDemo.class.getResource(path);if(imageURL==null){System.err.println("Resource not found: "+path);returnnull;}else{return(newImageIcon(imageURL,description)).getImage();}}}
ViniGodoy
O único problema é que Singletons não funcionam em Java:
Por causa da reflexão;
Por causa da possibilidade de haver multiplos classloaders;
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
publicstaticTrayIcontrayIcon;// método para alterar a mensagem do balão no trayiconpublicvoidmsgTray(Stringd,Stringtexto){this.trayIcon.displayMessage(d,texto,TrayIcon.MessageType.WARNING);}publicstaticvoidmain(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(UnsupportedLookAndFeelExceptionex){ex.printStackTrace();}catch(IllegalAccessExceptionex){ex.printStackTrace();}catch(InstantiationExceptionex){ex.printStackTrace();}catch(ClassNotFoundExceptionex){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(newRunnable(){publicvoidrun(){createAndShowGUI();}});}publicstaticvoidcreateAndShowGUI(){//Check the SystemTray supportif(!SystemTray.isSupported()){System.out.println("SystemTray is not supported");return;}finalPopupMenupopup=newPopupMenu();// tirei o final como estava e declarei lá em cima como public static// e criei o metodo msgTray para setar a mensagemtrayIcon=newTrayIcon(createImage("images/bulb.gif","tray icon"));finalSystemTraytray=SystemTray.getSystemTray();..........................restantedaclasse.............................
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í…