Swing/SingleAndDoubleClicksOnTrayIcon のバックアップ(No.1)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/SingleAndDoubleClicksOnTrayIcon へ行く。
- 1 (2024-10-14 (月) 17:46:07)
- category: swing folder: SingleAndDoubleClicksOnTrayIcon title: TrayIconがシングルまたはダブルクリックされたかを区別する tags: [SystemTray, TrayIcon, JPopupMenu] author: aterai pubdate: 2024-10-14T17:42:19+09:00 description: TrayIconがマウスでシングルクリックされたか、ダブルクリックされたかを区別して開くウィンドウを切り替えます。 image: https://drive.google.com/uc?id=1idiEouAZmnYlDXavCugINT9wzbkTSz-z
概要
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
)を開く- シングルクリックの場合ここでは何も実行しない