Как динамически анализировать число в JTextField - PullRequest
0 голосов
/ 11 июня 2019

Я пытаюсь динамически анализировать запись в JtextField, в основном, если мой пользователь набирает 100000 текстовое поле TextField 100 000

Я пытался показать всплывающее меню, но это не такКстати, я пытался просто разобрать, когда пользователь вводит ключ Enter или когда запись теряет фокус, и это работает, но это не совсем интуитивно понятно.

Так что есть немного кода, которыйrunnable, кстати, я знаю, что метод синтаксического анализа не очень эффективен, но на самом деле он работает ооочень ...

import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.JTextComponent;
import javax.swing.text.PlainDocument;
import java.awt.*;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.text.NumberFormat;
import java.text.ParseException;

public class Test extends PlainDocument {

    private static final long serialVersionUID = 1L;
    private final JTextComponent _textField;

    public Test(JTextComponent field) {
        _textField = field;
    }

    @Override
    public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {
        super.insertString(offs, str, a);
        String word = null;
        try {
            word = autoComplete(getText(0, getLength()));
        } catch (ParseException e) {
            e.printStackTrace();
        }
        if (word != null) {
            super.insertString(offs + str.length(), word, a);
            _textField.setCaretPosition(offs + str.length());
            _textField.moveCaretPosition(getLength());
        }
    }

    public String autoComplete(String text) throws ParseException {
        NumberFormat nf = NumberFormat.getInstance();
        if (nf.parse(text).intValue() > 0) {
            return numberParser(text);
        }
        return null;
    }

    public static JTextField createAutoCompleteTextField() {
        JTextField field = new JTextField(20);
        Test doc = new Test(field);
        field.setDocument(doc);
        return field;
    }


    public static void main(String args[]) {

        //Le jtextField qui sera autocompleté
        final JTextField field = Test.createAutoCompleteTextField();

        //Action clavier touche entrer
        field.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                int key = e.getKeyCode();
                if (key == KeyEvent.VK_ENTER) {
                    Toolkit.getDefaultToolkit().beep();
                    System.out.println("Text : " + field.getText());
                }
            }
        });


        //creation de fenetre principale
        JFrame frame = new JFrame("NumberParser");
        frame.setLayout(new FlowLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(new JLabel("Entry : "));
        frame.add(field);
        frame.pack();
        frame.setVisible(true);
    }

    public String numberParser(String data) {
        String out = "";
        if (data.length() >= 4 && !data.contains(".")) {
            switch (data.length()) {
                case 4:
                    out = data.substring(0, 1) + " " + data.substring(1, 4);
                    break;
                case 5:
                    out = data.substring(0, 2) + " " + data.substring(2, 5);
                    break;
                case 6:
                    out = data.substring(0, 3) + " " + data.substring(3, 6);
                    break;
                case 7:
                    out = data.substring(0, 1) + " " + data.substring(1, 4) + " " + data.substring(4, 7);
                    break;
                case 8:
                    out = data.substring(0, 2) + " " + data.substring(2, 5) + " " + data.substring(5, 8);
                    break;
                case 9:
                    out = data.substring(0, 3) + " " + data.substring(3, 6) + " " + data.substring(6, 9);
                    break;
                case 10:
                    out = data.substring(0, 1) + " " + data.substring(1, 4) + " " + data.substring(4, 7) + " " + data.substring(7, 10);
                    break;
                case 11:
                    out = data.substring(0, 2) + " " + data.substring(2, 5) + " " + data.substring(5, 8) + " " + data.substring(8, 11);
                    break;
                case 12:
                    out = data.substring(0, 3) + " " + data.substring(3, 6) + " " + data.substring(6, 9) + " " + data.substring(9, 12);
                    break;
                case 13:
                    out = data.substring(0, 1) + " " + data.substring(1, 4) + " " + data.substring(4, 7) + " " + data.substring(7, 10) + " " + data.substring(10, 13);
                    break;
                case 14:
                    out = data.substring(0, 2) + " " + data.substring(2, 5) + " " + data.substring(5, 8) + " " + data.substring(8, 11) + " " + data.substring(11, 14);
                    break;
                case 15:
                    out = data.substring(0, 3) + " " + data.substring(3, 6) + " " + data.substring(6, 9) + " " + data.substring(9, 12) + " " + data.substring(12, 15);
                    break;
            }
        } else if (data.contains(".")) {
            String deci = data.substring(data.indexOf("."));
            data = data.substring(0, data.indexOf("."));
            switch (data.length()) {
                case 4:
                    out = data.substring(0, 1) + " " + data.substring(1, 4) + deci;
                    break;
                case 5:
                    out = data.substring(0, 2) + " " + data.substring(2, 5) + deci;
                    break;
                case 6:
                    out = data.substring(0, 3) + " " + data.substring(3, 6) + deci;
                    break;
                case 7:
                    out = data.substring(0, 1) + " " + data.substring(1, 4) + " " + data.substring(4, 7) + deci;
                    break;
                case 8:
                    out = data.substring(0, 2) + " " + data.substring(2, 5) + " " + data.substring(5, 8) + deci;
                    break;
                case 9:
                    out = data.substring(0, 3) + " " + data.substring(3, 6) + " " + data.substring(6, 9) + deci;
                    break;
                case 10:
                    out = data.substring(0, 1) + " " + data.substring(1, 4) + " " + data.substring(4, 7) + " " + data.substring(7, 10) + deci;
                    break;
                case 11:
                    out = data.substring(0, 2) + " " + data.substring(2, 5) + " " + data.substring(5, 8) + " " + data.substring(8, 11) + deci;
                    break;
                case 12:
                    out = data.substring(0, 3) + " " + data.substring(3, 6) + " " + data.substring(6, 9) + " " + data.substring(9, 12) + deci;
                    break;
                case 13:
                    out = data.substring(0, 1) + " " + data.substring(1, 4) + " " + data.substring(4, 7) + " " + data.substring(7, 10) + " " + data.substring(10, 13) + deci;
                    break;
                case 14:
                    out = data.substring(0, 2) + " " + data.substring(2, 5) + " " + data.substring(5, 8) + " " + data.substring(8, 11) + " " + data.substring(11, 14) + deci;
                    break;
                case 15:
                    out = data.substring(0, 3) + " " + data.substring(3, 6) + " " + data.substring(6, 9) + " " + data.substring(9, 12) + " " + data.substring(12, 15) + deci;
                    break;
            }
        } else {
            out = data;
        }
        return out;
    }
}

Так что, как вы увидите, если вы наберете 1250, вывод в текстовое поле будет12501 250 и я хотел бы иметь только 1 250

...