TrayIcon

Seems like TrayIcon doesn't get mouse events when MainFrame is hidden. Anyone have a workaround for this?

Code below requires AppFramework.jar & swing-worker.jar

import java.awt.AWTException;

import java.awt.Image;

import java.awt.SystemTray;

import java.awt.Toolkit;

import java.awt.TrayIcon;

import java.awt.Window;

import java.awt.event.MouseEvent;

import java.awt.event.MouseListener;

import java.awt.event.WindowEvent;

import java.awt.event.WindowStateListener;

import javax.swing.JButton;

import javax.swing.JFrame;

import application.SingleFrameApplication;

publicclass MyApplicationextends SingleFrameApplication{

publicstaticvoid main(String[] args){

launch(MyApplication.class, args);

}

@Override

publicvoid startup(String[] ignoreArgs){

SystemTray systemTray = SystemTray.getSystemTray();

if(SystemTray.isSupported()){

Image image = Toolkit.getDefaultToolkit().getImage("tray.gif");

TrayIcon trayIcon =new TrayIcon(image);

trayIcon.addMouseListener(trayIconMouseListener);

trayIcon.setImageAutoSize(true);

try{

systemTray.add(trayIcon );

}catch (AWTException e){

e.printStackTrace();

}

}

getMainFrame().addWindowStateListener(windowStateListener);

show(new JButton("Hello World"));

}

private WindowStateListener windowStateListener =new WindowStateListener(){

publicvoid windowStateChanged(WindowEvent windowEvent){

if(windowEvent.getNewState() == JFrame.ICONIFIED){

Window window = windowEvent.getWindow();

window.setVisible(false);

}else{

Window window = windowEvent.getWindow();

window.setVisible(true);

}

}

};

private MouseListener trayIconMouseListener =new MouseListener(){

publicvoid mouseClicked(MouseEvent mouseEvent){

if(mouseEvent.getButton() == 1 && mouseEvent.getClickCount() == 2){

getMainFrame().setExtendedState(JFrame.NORMAL);

}

}

publicvoid mouseEntered(MouseEvent arg0){

}

publicvoid mouseExited(MouseEvent arg0){

}

publicvoid mousePressed(MouseEvent arg0){

}

publicvoid mouseReleased(MouseEvent arg0){

}

};

}

[4897 byte] By [jhhdka] at [2007-11-26 22:25:31]
# 1

Found solution myself.

private WindowStateListener windowStateListener = new WindowStateListener(){

public void windowStateChanged(WindowEvent windowEvent) {

if(windowEvent.getNewState() == JFrame.ICONIFIED){

Window window = windowEvent.getWindow();

window.setVisible(false);

} else {

Window window = windowEvent.getWindow();

window.setVisible(true);

}

}

};

changed to:

private WindowStateListener windowStateListener = new WindowStateListener(){

public void windowStateChanged(WindowEvent windowEvent) {

if(windowEvent.getNewState() == JFrame.ICONIFIED){

Window window = windowEvent.getWindow();

window.setVisible(false);

}

}

};

and

private MouseListener trayIconMouseListener = new MouseListener(){

public void mouseClicked(MouseEvent mouseEvent) {

if(mouseEvent.getButton() == 1 && mouseEvent.getClickCount() == 2){

getMainFrame().setExtendedState(JFrame.NORMAL);

}

}

public void mouseEntered(MouseEvent arg0) {

}

public void mouseExited(MouseEvent arg0) {

}

public void mousePressed(MouseEvent arg0) {

}

public void mouseReleased(MouseEvent arg0) {

}

};

changed to:

private MouseListener trayIconMouseListener = new MouseListener(){

public void mouseClicked(MouseEvent mouseEvent) {

if(mouseEvent.getButton() == 1 && mouseEvent.getClickCount() == 2){

getMainFrame().setVisible(true);

getMainFrame().setExtendedState(JFrame.NORMAL);

}

}

public void mouseEntered(MouseEvent arg0) {

}

public void mouseExited(MouseEvent arg0) {

}

public void mousePressed(MouseEvent arg0) {

}

public void mouseReleased(MouseEvent arg0) {

}

};

jhhdka at 2007-7-10 11:26:27 > top of Java-index,Desktop,Core GUI APIs...