Как я могу проверить, что текстовый виджет SWT является десятичным значением - PullRequest
2 голосов
/ 24 сентября 2011

В SWT текстовый виджет разрешает любую строку.Но что является наиболее подходящим виджетом SWT для ввода десятичного значения?

Я нашел два ответа:

  1. Сначала реализуем 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();
    }

}
  1. Использование FormattedText из проекта туманности: http://eclipse.org/nebula/

Кто-нибудь видит другое решение?

Ответы [ 3 ]

3 голосов
/ 24 сентября 2011

Более простой и понятный способ - использовать Double.parseString () и перехватывать исключение NumberFormatException, чтобы выяснить, можно ли преобразовать текст в него в двойное число.

0 голосов
/ 02 апреля 2019

Почему бы не использовать регулярное выражение в виджете, как показано ниже:

    if(Text.getText().matches("^[0-9]+$")) {
       show an error dialog or similar
    }
0 голосов
/ 17 марта 2016
  • Для проверки значений Double вы должны учитывать, что такие символы, как E, могут быть включены в Double, и что частичный ввод, такой как "4e-", должен быть действительным при вводе, чтобы позволить наконец ввести "4e-3" .Частичные выражения могут дать NumberFormatException для Double.parseDouble (partExpression)

  • Также см. Мой ответ на следующий связанный вопрос: Как установить маску для текста SWT, чтобы разрешить толькоДесятичные числа

  • (Примечание: если нужно разрешить только целочисленные значения, вместо текстового поля можно использовать Spinner.)

...