TrayIconがシングルまたはダブルクリックされたかを区別する
Total: 97
, Today: 1
, Yesterday: 2
Posted by aterai at
Last-modified:
概要
TrayIcon
がマウスでシングルクリックされたか、ダブルクリックされたかを区別して開くウィンドウを切り替えます。
Screenshot
Advertisement
サンプルコード
JDialog tmp = new JDialog();
tmp.setUndecorated(true);
tmp.setAlwaysOnTop(true);
Point loc = new Point();
Image image = makeDefaultTrayImage();
TrayIcon icon = new TrayIcon(image, "TRAY", null);
icon.addMouseListener(new TrayIconPopupMenuHandler(popup, tmp));
icon.addMouseListener(new MouseAdapter() {
private final Timer timer = new Timer(500, e -> {
((Timer) e.getSource()).stop();
openLookAndFeelBox(lnf, tmp, loc);
});
@Override public void mousePressed(MouseEvent e) {
loc.setLocation(e.getPoint());
if (SwingUtilities.isLeftMouseButton(e)) {
timer.setDelay(500);
timer.setRepeats(false);
timer.start();
}
}
@Override public void mouseClicked(MouseEvent e) {
boolean isDoubleClick = e.getClickCount() >= 2;
if (SwingUtilities.isLeftMouseButton(e) && isDoubleClick) {
timer.stop();
lnf.setVisible(false);
frame.setVisible(true);
}
}
});
try {
SystemTray.getSystemTray().add(icon);
} catch (AWTException ex) {
throw new IllegalStateException(ex);
}
View in GitHub: Java, Kotlin解説
TrayIcon
を右クリックした場合に開くポップアップメニューとしてjava.awt.PopupMenu
ではなくjavax.swing.JPopupMenu
を使用するよう設定JMenuItem
のタイトルに<table>
タグを使用してmnemonics
やaccelerators
ではなくマウスクリックの種類をヘルプ表示JPopupMenu
表示用のMouseListener
とは別にマウス左ボタンクリック用のMouseListener
をTrayIcon
に追加- TrayIconのダブルクリック
MouseListener#mousePressed(...)
で繰り返し無効(Timer#setRepeats(false)
)に設定したTimer
をスタート- 指定時間後にシングルクリック向けのウィンドウ(
JPopupMenu
で作成)を開く
- 指定時間後にシングルクリック向けのウィンドウ(
MouseListener#mouseClicked(...)
ではダブルクリックのみ検知してシングルクリック用のTimer
をストップし、ダブルクリック向けのウィンドウ(JFrame
)を開く- シングルクリックの場合ここでは何も実行しない