2013-01-12 46 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