Skip to Main Content

Java SE (Java Platform, Standard Edition)

Announcement

For appeals, questions and feedback about Oracle Forums, please email oracle-forums-moderators_us@oracle.com. Technical questions should be asked in the appropriate category. Thank you!

TrayIcon with PopupMenu or JPopupMenu ?

843807Feb 24 2007 — edited Mar 22 2007
Hi. (Sorry for my english.)

I spent last 10 whole days digging menu things in TrayIcon with no success :((.
I have three questions.

I can make JPopupWindow above MS-Windows task bar ( SwingUtilities.windowForComponent( JPupupMenu ).window.setAlwaysOnTop( true ) ) , but how to get keyboard focus/input ????

Looking back to normal PopupMenu ... when it pop up -> it blocks Event Dispatch Thread (EDT) (even if I fire it manually .show() from new Thread , I also tryed install new EventQueue ).
How to make non-blocking PopupMenu ? How to pop up via .show() without "origin" ? ( MouseEvent of TrayIcon returns null in .getComponent() ).

I am using Java 6.0 b105 and u1 b03 at WinXP.

Does anybody know solutions ?
Thanks !

PS: I wrote a very simple example.
It changes tray icon and JPanel background every 0.5 second. The question is : is program continue to work when you popup tray icon menu (right click) ?

This is the last event that goes thru EventQueue after I right click tray icon, and before menu shows (and blocks everythig): java.awt.event.InvocationEvent[INVOCATION_DEFAULT,runnable=sun.awt.windows.WTrayIconPeer$1@128e20a,notifier=null,catchExceptions=false,when=1172501444578] on sun.awt.windows.WToolkit@1e0cf70

//====================================
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class IsTrayIconMenuBlocking3
{
public static void main( String[] args ) throws Exception
{
// --- JFrame & JPanel section
final JPanel jp = new JPanel();

JFrame jf = new JFrame();
jf.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
jf.add( jp );
jf.setSize( 300 , 300 );
jf.setVisible( true );

// --- menu item action
ActionListener itemExitAction = new ActionListener()
{
public void actionPerformed( ActionEvent e )
{
System.out.println( "item action: exit" );
System.exit( 0 );
}
};

// --- popup menu
PopupMenu pm = new PopupMenu( "Tray Menu" );
MenuItem mi = new MenuItem( "Exit" );
mi.addActionListener( itemExitAction);
pm.add( mi );

// --- system tray & tray icon
final TrayIcon ti = new TrayIcon( ((ImageIcon)UIManager.getIcon("OptionPane.questionIcon")).getImage() , "Tray Icon" , pm );
SystemTray st = SystemTray.getSystemTray();
ti.setImageAutoSize( true );
st.add( ti );

// --- color & icon changing loop
final Image[] trayIcons = new Image[3];
trayIcons[0] = ((ImageIcon)UIManager.getIcon("OptionPane.errorIcon")).getImage();
trayIcons[1] = ((ImageIcon)UIManager.getIcon("OptionPane.warningIcon")).getImage();
trayIcons[2] = ((ImageIcon)UIManager.getIcon("OptionPane.informationIcon")).getImage();

Runnable colorChanger = new Runnable()
{
private int counter = 0;
private int icon_no = 0;

public void run()
{
System.out.println( "Hello from EDT " + counter++ );

if( jp.getBackground() == Color.RED )
jp.setBackground( Color.BLUE );
else
jp.setBackground( Color.RED );

ti.setImage( trayIcons[icon_no++] );
if( icon_no == trayIcons.length ) icon_no = 0;
}
};

while( true )
{
javax.swing.SwingUtilities.invokeLater( colorChanger);
try{Thread.sleep( 500 );} catch ( Exception e ){}
}

}

}
//====================================
Comments
Locked Post
New comments cannot be posted to this locked post.
Post Details
Locked on Apr 19 2007
Added on Feb 24 2007
1 comment
528 views