В SWT текстовый виджет разрешает любую строку.Но что является наиболее подходящим виджетом SWT для ввода десятичного значения?
Я нашел два ответа:
- Сначала реализуем VerifyKeyListener и VerifyListener, работаем для французской десятичной записино простой и легкий в реализации:
package test.actions;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.eclipse.swt.custom.VerifyKeyListener;
import org.eclipse.swt.events.VerifyEvent;
import org.eclipse.swt.events.VerifyListener;
import org.eclipse.swt.widgets.Text;
public final class AmountVerifyKeyListener implements VerifyListener, VerifyKeyListener {
private static final String REGEX = "^[-+]?[0-9]*[,]?[0-9]{0,2}+$";
private static final Pattern pattern = Pattern.compile(REGEX);
public void verifyText(VerifyEvent verifyevent) {
verify(verifyevent);
}
public void verifyKey(VerifyEvent verifyevent) {
verify(verifyevent);
}
private void verify (VerifyEvent e) {
String string = e.text;
char[] chars = new char[string.length()];
string.getChars(0, chars.length, chars, 0);
Text text = (Text)e.getSource();
if ( ( ",".equals(string) || ".".equals(string) ) && text.getText().indexOf(',') >= 0 ) {
e.doit = false;
return;
}
for (int i = 0; i < chars.length; i++) {
if (!(('0' <= chars[i] && chars[i] <= '9') || chars[i] == '.' || chars[i] == ',' || chars[i] == '-')) {
e.doit = false;
return;
}
if ( chars[i] == '.' ) {
chars[i] = ',';
}
}
e.text = new String(chars);
final String oldS = text.getText();
String newS = oldS.substring(0, e.start) + e.text + oldS.substring(e.end);
Matcher matcher = pattern.matcher(newS);
if ( !matcher.matches() ) {
e.doit = false;
return;
}
}
}
И основной класс, связанный с verifyKeyListener:
package test.actions;
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.GridData;
import org.eclipse.swt.layout.GridLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class TestMain {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shell.setLayout(new GridLayout(2, false));
final Text text = new Text(shell, SWT.NONE);
text.setLayoutData(new GridData(GridData.FILL_HORIZONTAL));
text.addVerifyListener(new AmountVerifyKeyListener() ) ;
shell.pack();
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch()) display.sleep();
}
display.dispose();
}
}
- Использование FormattedText из проекта туманности: http://eclipse.org/nebula/
Кто-нибудь видит другое решение?