【问题标题】:How to make a coordinate format for JTextField in java如何在java中为JTextField制作坐标格式
【发布时间】:2016-08-09 08:45:53
【问题描述】:

纬度:43,324523 经度:34,958140

我使用了这里提供的 IntegerField IntegerField

我可以解析数字以获得我喜欢的格式,但我想要它在框架屏幕中。当用户输入时(不输入点或逗号)

但是我将如何做到。

这是我要编辑的框架

In this screen it should be changed

Like the second box, User won't enter the dots 但这不是我喜欢的格式。当您阅读代码时,您会明白我的意思。

第三张截图是用这段代码拍摄的

DecimalFormat format = new DecimalFormat("##,####");
format.setGroupingUsed(true);
NumberFormatter formatter = new NumberFormatter(format);
formatter.setValueClass(Integer.class);                  
formatter.setMaximum(Integer.MAX_VALUE);
formatter.setAllowsInvalid(false);

IntegerField minField = new IntegerField();
JFormattedTextField maxField = new JFormattedTextField(formatter);

【问题讨论】:

    标签: java


    【解决方案1】:

    好的,我找到了解决方案。 MaskFormatter 很好地处理了这个问题。不过,任何其他想法都会受到赞赏

    MaskFormatter latitudeformat=new MaskFormatter("##.######");
    MaskFormatter longitudeformat=new MaskFormatter("###.######");
    latitudeformat.setPlaceholderCharacter('0');
    latitudeformat.setOverwriteMode(true);
    longitudeformat.setPlaceholderCharacter('0');
    longitudeformat.setOverwriteMode(true);    
    
    JFormattedTextField latitudeField = new JFormattedTextField(latitudeformat);
    JFormattedTextField longituteField = new JFormattedTextField(longitudeformat);
    

    【讨论】:

    • 经度从 -180 度到 +180 度。您只分配了 2 位数字。
    • @GilbertLeBlanc 是的,我知道只是复制粘贴。但这只是我找到的解决方法。也用这种方法我不能添加写负数..编辑了答案。顺便说一句,先生你知道如何改进这个答案,以便真正能够在 -90 到 +90 和 -180 到 +180 的范围内插入纬度和经度
    • MaskFormatter 不是为一般的双输入而设计的。我知道 + 和 - 没有掩码字符。
    【解决方案2】:

    我猜纬度和经度不是整数值;) 只使用两个带标签的 JTextField,一个用于经度,另一个用于纬度

    整数值基本上是从 0 到 9 和减号的数字字符串 要制作花车,您只需要接受“。”

    【讨论】:

    • 但我想让用户只能输入数字。所以我使用了 jformattedtextfield。
    • 这正是 =] 的文本字段,当您拥有日期或时间等格式的数据但读取数值 JTextField 更合适时,使用格式化的文本字段;你所要做的就是这个 txtField1 = new JTextField(10 );双值 = Double.parseDouble(txtField1.getText());
    • 不,你误会了。在框架中,我想允许用户在该字段中输入任何字符串。用户可以按照您的方式输入字符串。
    • @NicoT 会尝试,但问题是格式化而不是只接受整数:D
    【解决方案3】:

    GUI 将包含 2 个 JLabel 和 2 个 JTextField,按照您的示例进行排列。

    Latitude: 43,324523    Longitude: 34,958140
    

    您将使用以下代码在 JTextFields 中测试双精度:

    public double convertTextToDouble(String text) {
        try {
            return Double.valueOf(text);
        } catch (NumberFormatException e) {
            return Double.MIN_VALUE;
        }
    }
    

    如果文本是有效的双精度,您将返回双精度值。如果文本不是有效的双精度,您将返回最小双精度值。

    通常,您不会使用异常来测试无效值。在这种情况下,你应该因为异常已经存在。

    【讨论】:

    • 感谢您的回复。但这不是我想要的。我编辑帖子以便更清楚。对不起,英语水平低。
    【解决方案4】:
    MaskFormatter latitudeformat=new MaskFormatter("*##.######");
    **latitudeformat.setValidCharacters("-+1234567890");**
    MaskFormatter longitudeformat=new MaskFormatter("*###.######");
    **longitudeformat.setValidCharacters("-+1234567890");**
    latitudeformat.setPlaceholderCharacter('0');
    latitudeformat.setOverwriteMode(true);
    longitudeformat.setPlaceholderCharacter('0');
    longitudeformat.setOverwriteMode(true);    
    

    【讨论】:

    • 虽然此代码可以回答问题,但提供有关其解决问题的方式和原因的信息可提高其长期价值。
    • 传递给构造函数的掩码 *##.###### 期望第一个字符是任何字符,而其余字符是数字。有关此链接docs.oracle.com/javase/7/docs/api/javax/swing/text/… 的更多信息。我们通过进一步设置有效字符来进一步限制要输入的字符。因此第一个字母只能取 +- 或任何数字的值
    猜你喜欢
    • 2020-08-02
    • 1970-01-01
    • 2021-04-21
    • 2020-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-16
    • 2017-04-13
    相关资源
    最近更新 更多