2013-01-12 304 views
3

我正在尝试使用Swing构建一个使用JFrame的Java应用程序,并且在那里有5个JTextField实例。其中之一是Sum。如何更改JTextField的值?

我需要JTextField自动更改,只要我在文本字段中键入一些数字。

这怎么可能?

我写的是这里。

private void displaytotalActionPerformed(java.awt.event.ActionEvent evt) { 
// display total: 
Float num1,num2,num3,num4,num5,num6,result; 
num1 = display1b.getText().equals("") ? 0 : Float.parseFloat(display1b.getText()); 
num2 = display2b.getText().equals("") ? 0 : Float.parseFloat(display2b.getText()); 
num3 = display3b.getText().equals("") ? 0 : Float.parseFloat(display3b.getText()); 
num4 = display4b.getText().equals("") ? 0 : Float.parseFloat(display4b.getText()); 
num5 = display5b.getText().equals("") ? 0 : Float.parseFloat(display5b.getText()); 
num6 = display6b.getText().equals("") ? 0 : Float.parseFloat(display6b.getText()); 

result = num1+num2+num3+num4+num5+num6; 

System.out.println(result); 
} 

我试图得到的总和,并显示它在这个文本字段使用按钮,它的工作。但我希望它自动完成。但上面的代码不显示任何文本字段。

我对此很新,我很感谢你,如果你指导。

+0

你尝试过什么? Stackoverflow不会为你编写糟糕的代码。 – sjr

+0

它的哪个部分有问题 - 检测数据输入,将文本解析为数字,添加数字?为了更快地获得更好的帮助,请发布当前代码的[SSCCE](http://sscce.org/)(但注意它只需要3个文本字段 - 2个用于输入,另一个用于结果)。顺便说一句 - 数字是整数吗? –

+0

*“我很感激你是否善意地引导”*这是一件奇怪的事情,因为你忽视了我发布SSCCE的建议。表达欣赏的好方法是认真倾听并听取建议。请注意,如果“ActionListener”被添加到输入文本字段,并且当其中一个文本字段处于焦点状态时用户按下“Enter”,则侦听器将被激活。您也可以查看['DocumentListener'](http://docs.oracle.com/javase/7/docs/api/javax/swing/event/DocumentListener.html)。 –

回答

7

我认为你正在寻找

另一种方法是使用JFormattedTextField并使用侦听器。

一些建议。

  • 开发直觉,通常对java类的属性改变了(get|set)Property。使用像Netbeans这样的IDE,它会帮助你找到东西。
  • 自动化通常通过使用Listener来实现,只是学习何时使用(这也是直觉的一部分)。
  • 当您发现自己编写重复代码时,请考虑使用函数。即

代替具有6倍的:

display1b.getText().equals("") ? 0 : Float.parseFloat(display1b.getText()); 

考虑具有以ArrayList您的字段和编写他们迭代的函数,并具有上述的单线来设置所有的值。

  • 按照JavaTutorials进行硬编码的额外努力或在此处询问。对你来说会更有成效。因为你将学习如何为自己学习并深入研究文档。
+0

你是对的,但它不是OP所要查找的内容 - *“我需要JTextField在我输入文本字段中的某个数字时自动更改”*是我将关注的问题的一部分。如果您对如何实现此目标有一些想法,请更新您的答案:D – MadProgrammer

+0

@MadProgrammer用于什么?而不是指南,你提供了一个完整的编码答案。 – Roger

+0

因为你可能有一个更好的主意或解决方案(我真的不想看到你的答案画任何倒票) – MadProgrammer

6

您需要使用附加到每个数字字段的DocumentListener。这会在字段发生变化时提醒您。

从那里你需要调用某种sum方法来自动更新计数。

...

public class AutoSum { 

    public static void main(String[] args) { 
     new AutoSum(); 
    } 

    public AutoSum() { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       try { 
        UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); 
       } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { 
       } 

       JFrame frame = new JFrame("Testing"); 
       frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       frame.setLayout(new BorderLayout()); 
       frame.add(new AutoSumPane()); 
       frame.pack(); 
       frame.setLocationRelativeTo(null); 
       frame.setVisible(true); 
      } 
     }); 
    } 

    public class AutoSumPane extends JPanel { 

     private JTextField[] fields; 
     private JTextField tally; 

     public AutoSumPane() { 

      fields = new JTextField[5]; 

      DocumentListener docHandler = new DocumentListener() { 
       @Override 
       public void insertUpdate(DocumentEvent e) { 
        autoSum(); 
       } 

       @Override 
       public void removeUpdate(DocumentEvent e) { 
        autoSum(); 
       } 

       @Override 
       public void changedUpdate(DocumentEvent e) { 
        autoSum(); 
       } 
      }; 

      setLayout(new GridLayout(6, 1)); 
      for (int index = 0; index < 5; index++) { 
       fields[index] = new JTextField(3); 
       fields[index].getDocument().addDocumentListener(docHandler); 
       fields[index].setHorizontalAlignment(JTextField.RIGHT); 
       add(fields[index]); 
      } 

      tally = new JTextField(3); 
      tally.setHorizontalAlignment(JTextField.RIGHT); 
      tally.setEditable(false); 

      add(tally); 

     } 

     protected float getValue(JTextField field) { 
      float value = 0; 
      String text = field.getText(); 
      if (text != null && text.trim().length() > 0) { 
       try { 
        value = Float.parseFloat(text.trim()); 
       } catch (Exception e) { 
        e.printStackTrace(); 
       } 
      } 
      return value; 
     } 

     protected void autoSum() { 
      float sum = 0; 
      for (JTextField field : fields) { 
       sum += getValue(field); 
      } 
      tally.setText(NumberFormat.getNumberInstance().format(sum)); 
     } 
    } 
} 

例如。

查看How to Write a DocumentListener了解更多信息。

当你在这,你可能会发现感兴趣Implementing a DocumentFilter(和this的一些例子)

+0

非常感谢MadProgrammer。现在我知道DocumentListener是我需要学习的东西。 – user1971804

+1

+1好生气。也看到这个[示例](http://stackoverflow.com/questions/12677638/simultaneously-update-text-area-while-typing-in-text-field/12678020#12678020)和这[这里](http:///stackoverflow.com/questions/14174776/how-to-auto-calculate-input-numeric-values-of-text-field-in-java/14174868#14174868)(最后一个例子显示了如何使用文档过滤器来计算总和在飞行和相应的JTextField setText) –

+0

@david你只是喜欢我投票你的答案:) – MadProgrammer