【问题标题】:Java TextField questionJava TextField 问题
【发布时间】:2011-07-08 05:16:23
【问题描述】:

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

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

有谁知道这种类型的编码是否有示例?我搜索并找到了一个只接受数字的文本字段(NumericTextField),但这不适合我的需要,因为我想输入“10 ft”或“8.5 m”。

【问题讨论】:

  • 我认为更好的设计是让文本字段用于输入数字,然后有一个组合框来选择单位。这样您就不必担心人们是否会输入“ft”或“feet”等。
  • camcikr 是对的。那也会更直观
  • 另外,那个链接是旧的。实现数字文本字段的更好方法是使用 JFormattedTextField 或使用 DocumentFilter。

标签: java regex swing text field


【解决方案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();
        }
    }
}

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-12-14
      • 1970-01-01
      相关资源
      最近更新 更多