• 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がマウスでシングルクリックされたか、ダブルクリックされたかを区別して開くウィンドウを切り替えます。

サンプルコード

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>タグを使用してmnemonicsacceleratorsではなくマウスクリックの種類をヘルプ表示
  • JPopupMenu表示用のMouseListenerとは別にマウス左ボタンクリック用のMouseListenerTrayIconに追加
    • TrayIconのダブルクリック
    • MouseListener#mousePressed(...)で繰り返し無効(Timer#setRepeats(false))に設定したTimerをスタート
      • 指定時間後にシングルクリック向けのウィンドウ(JPopupMenuで作成)を開く
    • MouseListener#mouseClicked(...)ではダブルクリックのみ検知してシングルクリック用のTimerをストップし、ダブルクリック向けのウィンドウ(JFrame)を開く
      • シングルクリックの場合ここでは何も実行しない

参考リンク

コメント