2

Javaでシステムトレイアプリケーションを作成できますが、配置に問題があります。プログラムはいくつかの入力/出力を処理するだけでよいので、簡単にアクセスできるようにしたいと思います。

私の質問は、アプリケーションのシステムトレイアイコンをクリックしたときに、システムトレイの上のエレガントな位置を設定するにはどうすればよいですか?要件は、表示設定(解像度、マルチモニターなど)やタスクバーの場所に関係なくこれを行うことです。トレイを配置するのではなく、トレイの近くで開くように指示する方法はありますか?

Windowsの「ネットワーク」設定ボタンとまったく同じように動作させたい。次のようになります。

ネットワークシステムトレイ画像

これはJavaで可能ですか?

4

2 に答える 2

9

バルカンが指摘しているように、そうです、それは可能です。

また、ポップアップを配置する場所を考慮することも非常に可能です(タスクアイコンがある場所に関連して)

ポップアップを見せて

public class TestTrayIcon {

    protected static final PopupFrame POPUP_FRAME = new PopupFrame();

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {

                try {
                    TrayIcon trayIcon = new TrayIcon(ImageIO.read(new File("D:/DevWork/common/icons/iconex_v_bundle_png/iconexperience/v_collections_png/basic_foundation/16x16/plain/about.png")));
                    trayIcon.addMouseListener(new MouseAdapter() {
                        @Override
                        public void mouseClicked(MouseEvent e) {

                            Point pos = e.getLocationOnScreen();
                            Rectangle screen = getScreenBoundsAt(pos);

                            if (pos.x + POPUP_FRAME.getWidth() > screen.x + screen.width) {
                                pos.x = screen.x + screen.width - POPUP_FRAME.getWidth();
                            }
                            if (pos.x < screen.x) {
                                pos.x = screen.x;
                            }

                            if (pos.y + POPUP_FRAME.getHeight() > screen.y + screen.height) {
                                pos.y = screen.y + screen.height - POPUP_FRAME.getHeight();
                            }
                            if (pos.y < screen.y) {
                                pos.y = screen.y;
                            }

                            POPUP_FRAME.setLocation(pos);
                            POPUP_FRAME.setVisible(true);

                        }
                    });
                    SystemTray.getSystemTray().add(trayIcon);
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
            }
        });
    }

    public static class PopupFrame extends JFrame {

        public PopupFrame() throws HeadlessException {
            setLayout(new BorderLayout());
            add(new JLabel("Hello world"));
            pack();
        }
    }

    public static Rectangle getScreenBoundsAt(Point pos) {
        GraphicsDevice gd = getGraphicsDeviceAt(pos);
        Rectangle bounds = null;

        if (gd != null) {
            bounds = gd.getDefaultConfiguration().getBounds();
            Insets insets = Toolkit.getDefaultToolkit().getScreenInsets(gd.getDefaultConfiguration());

            bounds.x += insets.left;
            bounds.y += insets.top;
            bounds.width -= (insets.left + insets.right);
            bounds.height -= (insets.top + insets.bottom);
        }
        return bounds;
    }

    public static GraphicsDevice getGraphicsDeviceAt(Point pos) {
        GraphicsDevice device = null;

        GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice lstGDs[] = ge.getScreenDevices();

        ArrayList<GraphicsDevice> lstDevices = new ArrayList<GraphicsDevice>(lstGDs.length);

        for (GraphicsDevice gd : lstGDs) {
            GraphicsConfiguration gc = gd.getDefaultConfiguration();
            Rectangle screenBounds = gc.getBounds();

            if (screenBounds.contains(pos)) {
                lstDevices.add(gd);
            }
        }

        if (lstDevices.size() == 1) {
            device = lstDevices.get(0);
        }
        return device;
    }
}
于 2012-08-26T20:01:29.080 に答える
5

はい、可能です。

画面の右下隅を基準にしてウィンドウの位置を設定するには、グラフィック環境の最大ウィンドウ境界を取得してから、簡単な計算を実行します。

Rectangle screen = GraphicsEnvironment.getLocalGraphicsEnvironment()
        .getMaximumWindowBounds();
String os = System.getProperty("os.name");
if (os.contains("Windows")) {
    setLocation(screen.width - windowSize.width - 6, screen.height - windowSize.height - 6);
} else if (os.contains("Mac")) {
    setLocation(screen.width - windowSize.width + 6, 6);
}

幅と高さの- 6両方で、ウィンドウとタスクバーの間の小さなギャップを考慮し、簡単にカスタマイズできます。

ただし、このアプローチでは、上部または左側にあるWindowsタスクバーには、ウィンドウの右側/下部にタスクバーサイズのギャップがあることに注意してください。JavaAPIだけでタスクバーの向きを見つけることはできないと思います。

于 2012-08-26T19:46:37.073 に答える