Java TextField вопрос - PullRequest
       1

Java TextField вопрос

2 голосов
/ 08 июля 2011

Я пытаюсь создать собственный класс текстового поля, который принимает длины (например, размах крыльев самолета). Я могу установить систему единиц измерения по умолчанию, такую ​​как «дюймы», «футы», «метры» и т. Д., Но я также хотел бы иметь возможность вводить длины, которых нет в системе единиц измерения по умолчанию.

Так, например, если моя система единиц измерения по умолчанию - «метры», я хотел бы иметь возможность ввести «10,8 фута» в мое текстовое поле, а затем преобразовать из футов в метры.

Кто-нибудь знает, есть ли пример такого типа кодирования? Я искал и нашел текстовое поле, которое принимает только цифры (в NumericTextField ), но это не соответствует моим потребностям, потому что я хотел бы ввести «10 футов» или «8,5 м».

Ответы [ 2 ]

1 голос
/ 08 июля 2011

JScience обеспечивает поддержку строго типизированных физических величин и операций в org.jscience.physics.amount.

1 голос
/ 08 июля 2011

Вот решение:

public class MyCustomField extends JPanel
{
    public static final int METER = 1;
    public static final int FEET = 2;
    private int unit_index;
    public JTextField txt;
    public JLabel label;
    public MyCustomField(int size, int unit_index)
    {
        this.unit_index = unit_index;
        txt = new JTextField(size);
        ((AbstractDocument)txt.getDocument()).setDocumentFilter(new MyFilter());
        switch(unit_index)
        {
            case METER:
            label = new JLabel("m");
            break;

            case FEET:
            label = new JLabel("ft");
            break;

            default:
            label = new JLabel("m");
            break;
        }
        add(txt);
        add(label);
    }
    private class MyFilter extends DocumentFilter
    {
        public void insertString(DocumentFilter.FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException
        {
            StringBuilder sb = new StringBuilder();
            sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
            sb.insert(offset, text);
            if(!containsOnlyNumbers(sb.toString())) return;
            fb.insertString(offset, text, attr);
        }
        public void replace(DocumentFilter.FilterBypass fb, int offset, int length, String text, AttributeSet attr) throws BadLocationException
        {
            StringBuilder sb = new StringBuilder();
            sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
            sb.replace(offset, offset + length, text);
            if(!containsOnlyNumbers(sb.toString())) return;
            fb.replace(offset, length, text, attr);
        }
        private boolean containsOnlyNumbers(String text)
        {
            Pattern pattern = Pattern.compile("\\d*\\.?\\d*");
            Matcher matcher = pattern.matcher(text);
            return matcher.matches();
        }
    }
}

Я сделал это быстро.Вы можете улучшить его, добавив больше методов и юнитов, если вам нужно.

...