ページ更新: 2004-09-24 (金) (5229日前)

2004-09-23

SWT 3.0 の「システムトレイ」機能を試した。

目次

[編集]

情報源 #

Tray example snippet: place an icon with a popup menu on the system tray
Snippet143

SWTでタスクトレイを制御したことある方がいらっしゃいましたら
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=15052&forum=12

JAVAで「クイック起動」の制御ができるんでしょうか。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?forum=12&topic=14772

[編集]

おまけ #

jdic: Tray Icon API Readme
https://jdic.dev.java.net/documentation/incubator/tray/index.html

MobTaskTray(Win32 TaskTray for Java)
http://www.mobster.jp/agata/tasktray/
http://www.google.com/search?q=cache:www.mobster.jp/agata/tasktray/

New System Tray Functionality in Mustang (2005-11-13)
http://java.sun.com/developer/technicalArticles/J2SE/Desktop/mustang/systemtray/

  • J2SE 6.0のSwingでも出来るようになるそうだ。
[編集]

試したこと #

  • WindowBuilder 2.1.0GA で作成したコードに Snippet143 の内容を追加、
  • OS は Windows XP SP1
  • システムトレイへのアイコンの表示(2種類)
    アイコンは plugins/org.eclipse.swt.examples.launcher_3.0.0/icons の物を コピーして使用した。
  • アイコン上でのホバー表示
  • 右クリックでポップアップメニュー表示
  • 左クリック、左ダブルクリックの検出。
[編集]

画面 #

ToolTipを出してみた。
t01.png

右クリックでメニューを表示。このメニューでアイコンを選ぶ。ここではIcon1を選んである。
t02.png

右クリックでメニューを表示。Icon2を選んである。
t03.png

[編集]

ソースコード #

/*
 * Created on 2004/09/23
 */

package discypus.trial.swt;

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.graphics.Image;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Menu;
import org.eclipse.swt.widgets.MenuItem;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Tray;
import org.eclipse.swt.widgets.TrayItem;

/**
 * System Tray trial.
 */
public class SystemTrayTrial {
    private MenuItem useIcon2MenuItem;
    private MenuItem useIcon1MenuItem;
    private MenuItem exitMenuItem;
    private MenuItem hideShellMenuItem;
    private MenuItem showShellMenuItem;
    protected Shell shell;

    private TrayItem trayItem;
    private Image image1;
    private Image image2;

    public static void main(String[] args) {
        SystemTrayTrial window = new SystemTrayTrial();
        window.open();
    }

    public void open() {
        final Display display = Display.getDefault();
        image1 = new Image(display, "openFolder.gif");
        image2 = new Image(display, "closedFolder.gif");
        try {
            createContents();
            while (!shell.isDisposed()) {
                if (!display.readAndDispatch())
                    display.sleep();
            }
        } finally {
            image1.dispose(); ★2004-09-24 たぶん不要。
            image2.dispose(); ★2004-09-24 たぶん不要。
            display.dispose();
        }
    }

    protected void createContents() {
        // Shell
        shell = new Shell();
        shell.setSize(600, 400);
        shell.setText("SWT Application");

        // Popup Menu
        final Menu menu = new Menu(shell);
        shell.setMenu(menu);

        showShellMenuItem = new MenuItem(menu, SWT.NONE);
        showShellMenuItem.setText("Show Shell");
        showShellMenuItem.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                showShell();
            }
        });

        hideShellMenuItem = new MenuItem(menu, SWT.NONE);
        hideShellMenuItem.setText("Hide Shell");
        hideShellMenuItem.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                hideShell();
            }
        });

        useIcon1MenuItem = new MenuItem(menu, SWT.RADIO);
        useIcon1MenuItem.setText("Use Icon1");
        useIcon1MenuItem.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                trayItem.setImage(image1);
            }
        });

        useIcon2MenuItem = new MenuItem(menu, SWT.RADIO);
        useIcon2MenuItem.setText("Use Icon2");
        useIcon2MenuItem.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                trayItem.setImage(image2);
            }
        });

        exitMenuItem = new MenuItem(menu, SWT.NONE);
        exitMenuItem.setText("Exit");
        exitMenuItem.addSelectionListener(new SelectionAdapter() {
            public void widgetSelected(SelectionEvent e) {
                shell.close();
            }
        });

        // System tray
        final Tray tray = shell.getDisplay().getSystemTray();
        trayItem = new TrayItem(tray, SWT.NONE);
        trayItem.setToolTipText("SWT TrayItem");
        trayItem.setImage(image1);
        
        trayItem.addListener(SWT.Show, new Listener() {
            public void handleEvent(Event event) {
                System.out.println("show menu");
            }
        });
        trayItem.addListener(SWT.Hide, new Listener() {
            public void handleEvent(Event event) {
                System.out.println("hide menu");
            }
        });
        trayItem.addListener(SWT.Selection, new Listener() {
            public void handleEvent(Event event) {
                System.out.println("selection menu (left button clicked)");
            }
        });
        trayItem.addListener(SWT.DefaultSelection, new Listener() {
            public void handleEvent(Event event) {
                System.out.println("default selection menu (left button double-clicked)");
                showShell();
            }
        });
        trayItem.addListener(SWT.MenuDetect, new Listener() {
            public void handleEvent(Event event) {
                menu.setVisible(true);
            }
        });

        // etc.
        useIcon1MenuItem.setSelection(true);
        useIcon2MenuItem.setSelection(false);
        showShellMenuItem.setEnabled(true);
        hideShellMenuItem.setEnabled(false);
    }
    
    private void showShell() {
        shell.setVisible(true);
        showShellMenuItem.setEnabled(false);
        hideShellMenuItem.setEnabled(true);
    }
    
    private void hideShell() {
        shell.setVisible(false);
        showShellMenuItem.setEnabled(true);
        hideShellMenuItem.setEnabled(false);
    }
}