Tenho alguns JFrames e JDailogs que se relacionam entre si.
Quero incluir no meu projeto uma classe TrayMaker que será responsável pela implementação de um SystemTray ([url]http://download.oracle.com/javase/tutorial/uiswing/misc/systemtray.html[/url])
Quero que todos os eventos de todos os contêiners do projeto, quando acontecerem,
invoquem uma mesma instância proveniente de TrayMaker. Atualmente, num dado evento de um dado contêiner,
crio uma nova instância, como os exemplos abaixo:
//evento fechar JFrame principal
private void formWindowClosing(java.awt.event.WindowEvent evt) {
TrayMaker t = new TrayMaker();
t.criaEmostraGUI();
}
//evento fechar 'HelpDialog'
private void btFecharActionPerformed(java.awt.event.ActionEvent evt) {
TrayMaker t = new TrayMaker();
t.criaEmostraGUI();
}
dispose();
}
Creio que tornar TrayMaker Singleton seria ideal, mas gostaria de opiniões para garantir.
Segue o código-fonte inicial (sem aplicação do pattern):
package br.com.bb.compFone.frames;
import br.com.bb.compFone.dao.CompeTableDAO;
import br.com.bb.compFone.entity.CompeTable;
import java.awt.AWTException;
import java.awt.Image;
import java.awt.Menu;
import java.awt.MenuItem;
import java.awt.PopupMenu;
import java.awt.SystemTray;
import java.awt.TrayIcon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.net.URL;
import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
/**
*
* @author Marcel/6750699
*/
public class TrayMaker {
frmPrincipal f = new frmPrincipal(new javax.swing.JFrame(), true, new CompeTableDAO(), new CompeTable());
loginDialog d = new loginDialog(new javax.swing.JFrame(), true);
TableDialog tb = new TableDialog(new javax.swing.JFrame(), true);
helpDialog h = new helpDialog(new javax.swing.JFrame(), true);
AboutDialog a = new AboutDialog(new javax.swing.JFrame(), true);
// SystemTray code
public void criaEmostraGUI() {
//Check the SystemTray support
if (!SystemTray.isSupported()) {
System.out.println("Recurso SystemTray não suportado.");
return;
}
final PopupMenu popup = new PopupMenu();
final TrayIcon trayIcon = new TrayIcon(createImage(("/trayIcon.jpg"), "CompFone"));
final SystemTray tray = SystemTray.getSystemTray();
// Create a popup menu components
MenuItem pesquisarItem = new MenuItem("Pesquisar");
MenuItem gerenciarItem = new MenuItem("Gerenciar");
MenuItem listarItem = new MenuItem("Listar");
Menu subMenu = new Menu("SubMenu");
MenuItem helpItem = new MenuItem("Ajuda");
MenuItem aboutItem = new MenuItem("Sobre");
MenuItem exitItem = new MenuItem("Sair");
//Add components to popup menu
popup.add(pesquisarItem);
popup.addSeparator();
popup.add(gerenciarItem);
popup.addSeparator();
popup.add(listarItem);
popup.addSeparator();
popup.add(subMenu);
subMenu.add(aboutItem);
subMenu.add(helpItem);
popup.addSeparator();
popup.add(exitItem);
trayIcon.setImageAutoSize(true); // show full image
trayIcon.setToolTip("CompFone - versão 1.0");
trayIcon.setPopupMenu(popup);
try {
tray.add(trayIcon);
} catch (AWTException e) {
System.out.println("TrayIcon não pode ser adicionado.");
return;
}
// double-click
trayIcon.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
f.setVisible(true);
tray.remove(trayIcon);
}
});
// from Tray menu
pesquisarItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
f.setVisible(true);
tray.remove(trayIcon);
}
});
gerenciarItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
d.setVisible(true);
tray.remove(trayIcon);
}
});
listarItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
tb.setVisible(true);
tray.remove(trayIcon);
}
});
helpItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
h.setVisible(true);
tray.remove(trayIcon);
}
});
aboutItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
a.setVisible(true);
tray.remove(trayIcon);
}
});
ActionListener listener = new ActionListener() {
public void actionPerformed(ActionEvent e) {
MenuItem item = (MenuItem) e.getSource();
System.out.println(item.getLabel());
if ("Pesquisar".equals(item.getLabel())) {
trayIcon.displayMessage("CompFone - versão 1.0", "Clique aqui para ativar.", TrayIcon.MessageType.INFO);
}
}
};
helpItem.addActionListener(listener);
aboutItem.addActionListener(listener);
exitItem.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
ImageIcon icon = new ImageIcon(("/compFone/sair.png"));
int result = JOptionPane.showConfirmDialog(f, "Deseja sair ?", "Sair", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, icon);
if (result == 0) {
tray.remove(trayIcon);
System.exit(0);
}
//f.txtEmp.requestFocus();
return;
}
});
}
//Obtain the image URL
protected static Image createImage(String path, String description) {
URL imageURL = frmPrincipal.class.getResource(path);
if (imageURL == null) {
System.err.println("Recurso não encontrado: " + path);
return null;
} else {
return (new ImageIcon(imageURL, description)).getImage();
}
}
}
Agradeço pelas sugestões.