如何获取SWT Tray或TrayItem位置

时间:2011-06-23 10:26:48

标签: java eclipse swt eclipse-rcp jface

有关如何使用SWT获取系统托盘(托盘)或项目(TrayItem)的位置的任何想法?从显示器获取界限只会给我整个屏幕的界限。即

item.getDisplay().getBounds();

会在我的Windows框上给我(0,0,1024,1024)。

我还想知道系统托盘位置(左,右,顶部,底部)是否可以根据位置猜测。 这就是我可以在系统托盘附近弹出消息

这是此post的副本,但我想提供赏金(并控制我认为正确的答案)。

5 个答案:

答案 0 :(得分:2)

如果您只想在托盘项目附近显示对用户事件做出反应的shell(就我的情况而定)。通过托盘项触发事件时,您可以获取指针位置:

trayItem.addSelectionListener (new SelectionListener () {
    @Override public void widgetDefaultSelected (SelectionEvent aEvent) {
        widgetSelected (aEvent);
    }

    @Override public void widgetSelected (SelectionEvent aEvent) {
        if (mWindow.isVisible ()) {
            Shell wnd = mWindow;
            mWindow = new Shell (mDisplay);
            wnd.close ();
        }
        else {
            mWindow.setLocation (mDisplay.getCursorLocation ());
            mWindow.open ();
        }
    }
});

您可以找到整个源代码here

如果你想通知其他一些事件(不是由用户输入产生),我猜你最好的选择就是使用SandT在上一个答案中指出的工具提示。

祝你好运!!!

答案 1 :(得分:1)

widget.getDisplay()始终返回用于指定窗口小部件的显示,因此永远不会有效。

就我所看到的Win32和MacOS而言,你不会在项目本身的第一个鼠标事件之前得到位置; - (

如果您愿意添加一些与体系结构相关的代码,可以尝试以下代码......

对于MacOS - 虽然没有经过测试:

  • 子类TrayItem(请记得覆盖checkSubClass()
  • 使用getLocation()返回商品的当前位置

对于Win32 - 再次未经测试 - 您可以尝试相同但这次覆盖messageProc(...)。第一条消息之一将允许您查询句柄的当前位置...

答案 2 :(得分:0)

从API猜测,看起来没有这样的选项(与例如ToolItem相反)。 :(

答案 3 :(得分:0)

您可以使用Display.map从一个坐标系映射到另一个坐标系。您可以通过执行以下操作将项目的0,0(左上角)映射到显示坐标:

Display.map(item, null, 0, 0)

使用null作为“to”控件以映射到Display坐标空间。

答案 4 :(得分:0)

感谢那些试图回答的人。然而,和其他post一样,我认为这是不可能的,所以我在否定地回答我自己的问题:(