Java TextField问题

时间:2011-07-08 05:16:23

标签: java regex swing text field

我正在尝试构建一个接受长度的自定义文本字段类(例如,飞机机翼的跨度)。我可以设置默认单位系统,如“英寸”,“英尺”,“米”等。但我也希望能够输入不在默认单位系统中的长度。

例如,如果我的默认单位系统是“米”,我希望能够在我的文本字段中输入“10.8英尺”,然后从英尺转换为米。

有没有人知道是否有这种编码的例子?我搜索并找到了一个只接受数字(NumericTextField)的文本字段,但这不符合我的需要,因为我想输入“10英尺”或“8.5米”。

2 个答案:

答案 0 :(得分:1)

这是一个解决方案:

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();
        }
    }
}

我很快就做到了。如果需要,可以通过添加更多方法和单位来改进它。

答案 1 :(得分:1)

JScienceorg.jscience.physics.amount中的强类型物理量和操作提供支持。