Swing:为什么JFormattedTextField在焦点丢失时添加“,”

时间:2011-07-14 23:39:02

标签: java swing jformattedtextfield

问题出在标题中。

我在我的文本字段中显示一个int号,但是当我退出该字段时它会不断添加“,”...为什么会有任何想法?

代码爱好者:

onfocuslost调用:

if(textStiffness != null){
            String s1 = textStiffness.getText();
            if(s1 != null){
                stiffness = Float.valueOf(s1.replaceAll(",", "")).intValue();
                stiffness = Math.max(0, stiffness);
            }
        }

然后:

if(textStiffness != null){
            textStiffness.setText((""+(int)stiffness).replaceAll(",", ""));

        }

我检查了字段中设置的文本及其正确的10000,但随后它变为10,000,我看不出为什么

2 个答案:

答案 0 :(得分:2)

您仍未向我们显示NumberFormat正在使用的JFormattedTextField,这实际上是解决问题所需的关键信息。我只能假设您使用NumberFormat.getNumberInstance()作为格式化程序,如果是这样,如果您检查此类的API,您将看到对于此对象,groupingUsed属性默认设置为true 。你想将它设置为false以摆脱你的逗号。

例如这是我的SSCCE,它显示了您的问题及其解决方案:

import java.awt.BorderLayout;
import java.text.NumberFormat;

import javax.swing.*;

public class FormattedFieldFun {
   private static void createAndShowUI() {
      NumberFormat numberFormatGuFalse = NumberFormat.getNumberInstance();
      numberFormatGuFalse.setGroupingUsed(false);  // ***** HERE *****
      JFormattedTextField jftFieldGuFalse = 
          new JFormattedTextField(numberFormatGuFalse);

      NumberFormat numberFormatGuTrue = NumberFormat.getNumberInstance();
      // numberFormatGuFalse.setGroupingUsed(true); // not necessary as is default
      JFormattedTextField jftFieldGuTrue = 
          new JFormattedTextField(numberFormatGuTrue);

      JPanel panel = new JPanel(new BorderLayout());
      panel.add(jftFieldGuFalse, BorderLayout.NORTH);
      panel.add(jftFieldGuTrue, BorderLayout.SOUTH);

      JFrame frame = new JFrame("FormattedFieldFun");
      frame.getContentPane().add(panel);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.pack();
      frame.setLocationRelativeTo(null);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      java.awt.EventQueue.invokeLater(new Runnable() {
         public void run() {
            createAndShowUI();
         }
      });
   }
}

答案 1 :(得分:1)

阅读the docs,我发现了一些观察结果:

  

注意:某些格式化程序可能会不断更新值,导致焦点丢失无意义,因为值始终与文本指定的值相同。

     

请注意,虽然JFormattedTextField类从JTextField类继承setText方法,但通常不会在格式化的文本字段上调用setText方法。如果这样做,字段的显示会相应更改但值不会更新(除非字段的格式化程序不断更新)。

以及setFocusLostBehavior(int)

  

指定失去焦点的字段的结果。可能的值在JFormattedTextField中定义为COMMIT_OR_REVERT(默认值),COMMIT(如果有效则提交,否则保持一切相同),PERSIST(不执行任何操作)和REVERT(更改文本以反映值)。