swt的Text输入数字(包括负数和小数)

import org.eclipse.swt.SWT;
import org.eclipse.swt.events.ModifyEvent;
import org.eclipse.swt.events.ModifyListener;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;

public class SWTNumberText {

	private Shell shell;

	private Text text1;
	private Text text2;

	/**
	 * 初始化各种组件
	 */
	public void open() {
		Display display = new Display();
		shell = new Shell(display);

		// 初始化监听器
		ModifyListener modifyListener = new ModifyListener() {
			@Override
			public void modifyText(ModifyEvent e) {
				String textStr = ((Text) e.widget).getText();
				if (textStr == null || textStr.equals("")) {
					return;
				}

				if (textStr.equals("-") || textStr.startsWith(".") || textStr.endsWith(".") || textStr.startsWith("-.")) {
					return;
				}

				// 注意,这里是可以进行其它操作的地方
				// 如果能顺利通过前面的判断,那输入已合法,可以进行一些相应的操作,比如读取内容进行计算
				// 暂时只是将两个数相乘
				System.err.println(Double.parseDouble(text1.getText()) * Double.parseDouble(text2.getText()));
			}
		};

		VerifyListener verifyListener = new VerifyListener() {

			@Override
			public void verifyText(VerifyEvent event) {
				// 允许"backspace"和"delete"进行删除
				if (event.keyCode == SWT.BS || event.keyCode == SWT.DEL) {
					event.doit = true;
					return;
				}
				event.doit = false;
				char myChar = event.character;
				Text text = (Text) event.widget;
				String textStr = text.getText();
				if (myChar == '-') {
					if (textStr.indexOf("-") == -1) {
						if (event.start == 0) {
							event.doit = true;
						}
					}
				} else if (myChar == '.') {
					if (textStr.indexOf(".") == -1) {
						if (event.start != 0) {
							event.doit = true;
						}
					}
				} else {
					// 其余的只能输入数字
					if ((myChar >= '0' && myChar <= '9')) {
						event.doit = true;
					}
				}
			}
		};

		shell.setLayout(new GridLayout(2, false));

		new Label(shell, SWT.NONE).setText("标签1");
		text1 = new Text(shell, SWT.NONE);// 这里各种外观自己控制
		text1.setText("1");
		GridData gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
		gridData.grabExcessHorizontalSpace = true;
		gridData.grabExcessVerticalSpace = true;
		text1.setLayoutData(gridData);

		new Label(shell, SWT.NONE).setText("标签2");
		text2 = new Text(shell, SWT.NONE);// 这里各种外观自己控制
		text2.setText("2");
		gridData = new GridData(GridData.HORIZONTAL_ALIGN_FILL | GridData.VERTICAL_ALIGN_FILL);
		gridData.grabExcessHorizontalSpace = true;
		gridData.grabExcessVerticalSpace = true;
		text2.setLayoutData(gridData);

		// 添加监听器
		text1.addVerifyListener(verifyListener);
		text1.addModifyListener(modifyListener);

		text2.addVerifyListener(verifyListener);
		text2.addModifyListener(modifyListener);

		shell.setSize(200, 100);

		shell.open();
	}

	public void run() {
		Display display = shell.getDisplay();
		while (!shell.isDisposed()) {
			if (!display.readAndDispatch())
				display.sleep();
		}
	}

	public static void main(String[] args) {
		SWTNumberText swtNumberText = new SWTNumberText();
		swtNumberText.open();
		swtNumberText.run();
	}

}


 
 

  效果图如下:

 

    

  上面的例子中,swt的text可以及时监听输入。注意:这里有一个前提,就是每一个text要有默认值,或者在计算的时候自己去判断getText()为空。这里为了简便,就不判空。

     注意:Text加了监听器之后,直接调用setText()方法会有问题,拿到一个空值,所以在setText()之前,要先remove掉这两个监听器,在setText()之后,再添加回来。像下面:

		// 先移除监听
		text1.removeVerifyListener(verifyListener);
		text1.removeModifyListener(modifyListener);
		// 然后设置值
		text1.setText("1111");
		// 最后再添加监听器
		text1.addVerifyListener(verifyListener);
		text1.addModifyListener(modifyListener);

   上面这一段代码看上去挺奇怪,又移除又添加的,但其实仔细一想就很容易明白,监听器监听的其实是用户的输入,而用户的输入每次都会被监听,所以如果你能确信自己set进去的内容没有问题,就应该把监听器拿掉,要不然监听器也会对setText()的内容进行监听。但由于setText()一次搞进去一个字符串,监听器好像会有点问题,具体的细节我没有去深究,-_-!先酱紫用着了







  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值