如何收听组小部件(Java SWT)的文本修改事件?

Posted

技术标签:

【中文标题】如何收听组小部件(Java SWT)的文本修改事件?【英文标题】:How to listen to text modify event of group widget (Java SWT)? 【发布时间】:2014-06-06 06:59:28 【问题描述】:

我要做的是:当我更改Group小部件的标题时(通过调用setText()方法),我需要检查标题,如果包含某些字符,我会做一些事情。

现在的问题是,如何监听 Group widget 的 text modify 事件?

我尝试了addListener(SWT.Modify, listener); 方法,(参见下面的示例),它不起作用。

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionAdapter;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Group;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;

public class Test 

    public static void main(String[] args)
    
        final Display display = new Display();
        Shell shell = new Shell(display);
        shell.setLayout(new GridLayout(1, false));
        shell.setText("***");

        final Group group = new Group(shell, SWT.NONE);
        group.setText("title0");

        group.addListener(SWT.Modify, new Listener() 

            @Override
            public void handleEvent(Event event) 
                // TODO Auto-generated method stub
                System.out.println("Group title changed");
            

        );

        Button btn = new Button(shell, SWT.NONE);
        btn.setText("Press to set title of Group."); 

        btn.addSelectionListener(new SelectionAdapter() 

            @Override
            public void widgetSelected(SelectionEvent e) 
                // TODO Auto-generated method stub
                group.setText("title1"); 
            

        );

        shell.pack();
        shell.open();

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


【问题讨论】:

Group 在调用setText 时不会生成任何事件。 您应该在致电setText(String) 之前进行检查。您甚至可以创建一个辅助函数来执行此操作。 【参考方案1】:

我有解决方法在这里使用Widget 类上的setData() 方法并将PaintListener 添加到组小部件

group.setData(new String(group.getText()));

    group.addPaintListener(new PaintListener() 

        @Override
        public void paintControl(PaintEvent e) 
            if (e.widget instanceof Group) 
                Group grp = (Group)e.widget;
                String data = (String)grp.getData();
                if (!data.equals(grp.getText())) 
                    System.out.println("Title changed");
                    grp.setData(grp.getText()); //Keep new changed title as data
                
            

        
    );

每当标题更改时,都会触发绘制事件。我将组小部件标题文本保留为数据并比较绘制侦听器中的更改。

注意paint listener会被调用很多次,所以建议你在里面少写代码。

【讨论】:

这正是我要找的!非常感谢!会注意“paint listener会被调用很多次”,再次感谢!! 欢迎。还要编辑帖子并添加导入语句和测试类。然后其他人就可以轻松地将您的代码快速复制并粘贴到他们的编辑器中并进行修复。

以上是关于如何收听组小部件(Java SWT)的文本修改事件?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 AngularJS 中收听 jQuery 事件

如何收听消息阅读事件

只有当用户完成修改文本小部件时,我才能触发事件吗?

Eclipse中如何配置SWT

如何显示swt文本框的悬停文本

Java SWT 创建侦听器以更改标签的文本并返回数据