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()一次搞进去一个字符串,监听器好像会有点问题,具体的细节我没有去深究,-_-!先酱紫用着了