在 SWT 中禁用组件选择

Posted

技术标签:

【中文标题】在 SWT 中禁用组件选择【英文标题】:Disable component selection in SWT 【发布时间】:2012-11-16 02:56:07 【问题描述】:

我要做的是用鼠标在四个标签上绘制,这些标签通过paintListner与盒子布局组合在一起,添加到每个标签上。此外,每个标签都有一个 MouseMoveListener,它将每个鼠标点添加到一个 ArrayList。这是一个标签 l 的代码:

l.addMouseMoveListener(new MouseMoveListener() 
    public void mouseMove(MouseEvent e) 
        compLocation.setLocation(l.getLocation().x, l.getLocation().y);
        pointsToDraw1.get(n).add(new Point(e.x, e.y));
        l.redraw();
     

);


l.addPaintListener(new PaintListener()
    @Override
    public void paintControl(PaintEvent e) 
     Device device = Display.getCurrent ();
     Color red = new Color (device, 255, 0, 0);
     e.gc.setBackground(red);
     for(Point p : pointsToDraw1.get(n))
        e.gc.fillRectangle(p.x, p.y, 4, 4);
     

    

);

当我用鼠标移动标签时,一切正常(参见示例图像的顶部)。一旦我按下鼠标左键并在绘图时保持按下状态,我只在开始按下按钮的标签上绘图(参见示例图像的底部)。这是因为我通过单击自动选择标签。是否有可能以某种方式禁用此自动选择并仅检查是否按下了鼠标左键?我只想在按下鼠标左键时进行绘制。

图片:

【问题讨论】:

您是否尝试过为每个标签添加SWT.MouseDown 的侦听器并设置event.doit = false;?这可能阻止选择。 那确实行不通。还是同样的问题。我添加了以下内容: Listener listener = new Listener () public void handleEvent(Event e) e.doit = false; ; l.addListener(SWT.MouseDown, listener); “我通过点击自动选择标签”是什么意思。你说标签被选中是什么意思? @WaqasIlyas 我猜他的意思是他点击的标签获得焦点。 @user1643687 您是否尝试在 SWT.MouseDown 侦听器中对标签的父 Composite 调用 setFocus()forceFocus() 【参考方案1】:

这是工作示例。它应该做你正在寻找的东西

    final Display display = new Display();
    final Shell shell = new Shell(display);
    shell.setSize(400, 400);
    final Point p = new Point(0, 0);
    shell.addMouseMoveListener(new MouseMoveListener() 

      @Override
      public void mouseMove(MouseEvent e) 

         p.x = e.x;
         p.y = e.y;

         shell.redraw(p.x,p.y,2,2,true);

         for(Control c: shell.getChildren())
         
           if(c.getBounds().contains(p))
           
             Point t = e.display.map(shell, c, p);
             p.x = t.x;
             p.y = t.y;
             c.redraw(p.x,p.y,2,2,true);
           
         

      
    );
    PaintListener painter = new PaintListener() 

      @Override
      public void paintControl(PaintEvent e) 

        e.gc.setBackground(e.display.getSystemColor(SWT.COLOR_BLUE));
        e.gc.fillRectangle(p.x, p.y, 2, 2);

      
    ;
    shell.addPaintListener(painter);
    final Label l = new Label(shell, SWT.NONE);
    l.setBounds(10, 10, 60, 40);
    l.setBackground(display.getSystemColor(SWT.COLOR_CYAN));
    l.setText("Label1");
    l.addPaintListener(painter);
    l.addMouseMoveListener(new MouseMoveListener() 

      @Override
      public void mouseMove(MouseEvent e) 


        p.x = e.x;
        p.y = e.y;

        Point t = e.display.map(l, shell, p);

        Rectangle bounds = l.getBounds();
        if(bounds.contains(t))
        
          l.redraw(p.x,p.y,2,2,true);
        
        else
        
          p.x = t.x;
          p.y = t.y;
          shell.redraw(p.x,p.y,2,2,true);
        
      
    );

    shell.open();
    while (!shell.isDisposed()) 
        if (!display.readAndDispatch()) 
            display.sleep();
        
    
    display.dispose();

【讨论】:

以上是关于在 SWT 中禁用组件选择的主要内容,如果未能解决你的问题,请参考以下文章

如何在一个单独的线程完成之前禁用 SWT selectionListener

要启用或禁用按钮上的选择组件,请单击角度材质

从组件角度禁用事件单击

Eclipse SWT:如何禁用鼠标滚轮上的滚动复合滚动

SWT 按钮下拉控件

SWT 安装