【问题标题】:How to track mouse over on an item in an SWT combo box (hot tracking)如何在 SWT 组合框中的项目上跟踪鼠标(热跟踪)
【发布时间】:2020-12-07 04:59:36
【问题描述】:

我有一个显示各种项目的组合框。我想根据鼠标指针下的项目更改工具提示文本。由于我无法为每个项目设置工具提示,因此我需要更改组合框的工具提示。

如何获取鼠标指针下的项目?我可以设置一个事件来跟踪鼠标移动,然后为鼠标获取点,但是我找不到在组合中获取与点位置匹配的项目的方法。

一棵树有这个:

private class KeyTreeMouseMoveListener implements MouseMoveListener
{
    @Override
    public void mouseMove( MouseEvent event )
    {
       TreeItem item = tree.getItem( new Point( event.x, event.y ) );
    }
}

但我找不到用于组合框的类似方法。

类似:

private class ComboMouseMoveListener implements MouseMoveListener
{
    @Override
    public void mouseMove( MouseEvent event )
    {
       int index = combo.getIndex( new Point( event.x, event.y ) );
    }
}

会很好:-)

【问题讨论】:

  • 由于组合使用本机控件,这可能是不可能的。
  • 是的,我是这么认为的。
  • 为了让它更有趣,工具提示仅在组合框“关闭”时显示。如果单击组合框并展开,则不会显示工具提示。
  • 这在不同的平台上也会表现得非常不同。 macOS 组合与 Windows 组合完全不同。您还可以查看CCombo,它主要是 SWT 代码而不是本机代码。
  • 仍然是相同的行为,仅当组合框关闭时才显示提示信息。因此,即使我可以热跟踪鼠标并获取底层项目,工具提示也不会显示

标签: java swt


【解决方案1】:

好吧,这有点丑陋,也是一种不好的做法,所以不要在家里尝试这个......

private class ComboModifyListener implements ModifyListener
{
    @Override
    public void modifyText( ModifyEvent e )
    {
      <code to get the selected item>
      combo.setToolTipText( "item tooltip text" );

      // ugly part
      ivShell.getDisplay().setCursorLocation(
        ivShell.getLocation().x + combo.getLocation().x + 15,
        ivShell.getLocation().y + combo.getLocation().y + 35 );
    }
}

所以在用户选择了一个项目之后,我获取了该项目,设置了组合工具提示,然后移动光标,使其现在位于组合框上方。 x + 15y + 35 是组合框左上角的 SWAG 偏移量。

是的,我知道在程序控制下移动光标是不好的做法,但它确实显示了所选项目的工具提示。

【讨论】:

  • 好的,稍微清理一下,鼠标就会向上移动:ivShell.getDisplay().setCursorLocation( ivShell.getDisplay().getCursorLocation().x, ivShell.getLocation().y + combo.getLocation().y + 35 );
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-11-10
  • 1970-01-01
  • 2014-12-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-10
  • 1970-01-01
相关资源
最近更新 更多