2012-09-18 34 views
4

爲我的Java學習我做了使用包含三個JTextField的情況下,爲用戶輸入一些數字,然後將這些numbres的總和NetBeans中jForm的一部分顯示在另一個的JTextField 。這當然非常簡單,但我希望能夠在沒有任何按鈕的情況下執行此操作。每次修改3個文本字段中的任何一個時,我都不知道如何「更新」總和。誰能幫我?更新JTextField的總和自動每次他們改變(JAVA)

這裏是我的代碼(形式與設計模式的NetBeans完成):

package sumfields; 

public class Frame extends javax.swing.JFrame { 


    public Frame() { 
     initComponents(); 
    } 

    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() { 

     n1 = new javax.swing.JTextField(); 
     n2 = new javax.swing.JTextField(); 
     n3 = new javax.swing.JTextField(); 
     sum = new javax.swing.JTextField(); 
     jLabel1 = new javax.swing.JLabel(); 
     jLabel2 = new javax.swing.JLabel(); 
     jLabel3 = new javax.swing.JLabel(); 
     jLabel5 = new javax.swing.JLabel(); 
     jButton1 = new javax.swing.JButton(); 

     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jLabel1.setText("n1"); 

     jLabel2.setText("n2"); 

     jLabel3.setText("n3"); 

     jLabel5.setText("result"); 

     jButton1.setText("Opperate"); 
     jButton1.addActionListener(new java.awt.event.ActionListener() { 
      public void actionPerformed(java.awt.event.ActionEvent evt) { 
       jButton1ActionPerformed(evt); 
      } 
     }); 

     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addGroup(layout.createSequentialGroup() 
         .addGap(15, 15, 15) 
         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 
          .addComponent(jLabel1) 
          .addComponent(jLabel2) 
          .addComponent(jLabel3))) 
        .addGroup(layout.createSequentialGroup() 
         .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
         .addComponent(jLabel5))) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addGroup(layout.createSequentialGroup() 
         .addComponent(sum, javax.swing.GroupLayout.PREFERRED_SIZE, 59, javax.swing.GroupLayout.PREFERRED_SIZE) 
         .addGap(30, 30, 30) 
         .addComponent(jButton1, javax.swing.GroupLayout.PREFERRED_SIZE, 79, javax.swing.GroupLayout.PREFERRED_SIZE) 
         .addContainerGap()) 
        .addGroup(layout.createSequentialGroup() 
         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
          .addComponent(n1, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE) 
          .addComponent(n2, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE) 
          .addComponent(n3, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)) 
         .addGap(0, 0, Short.MAX_VALUE)))) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(32, 32, 32) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 
        .addGroup(layout.createSequentialGroup() 
         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
          .addComponent(n1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
          .addComponent(jLabel1)) 
         .addGap(10, 10, 10) 
         .addComponent(n2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
        .addComponent(jLabel2)) 
       .addGap(20, 20, 20) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(n3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(jLabel3)) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(sum, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(jButton1) 
        .addComponent(jLabel5)) 
       .addContainerGap(38, Short.MAX_VALUE)) 
     ); 

     pack(); 
    }// </editor-fold> 

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
     int r=Integer.parseInt(n1.getText())+Integer.parseInt(n2.getText())+Integer.parseInt(n3.getText()); 
     sum.setText(""+r); 

    } 

    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new Frame().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify 
    private javax.swing.JButton jButton1; 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JLabel jLabel2; 
    private javax.swing.JLabel jLabel3; 
    private javax.swing.JLabel jLabel5; 
    private javax.swing.JTextField n1; 
    private javax.swing.JTextField n2; 
    private javax.swing.JTextField n3; 
    private javax.swing.JTextField sum; 
    // End of variables declaration 
} 

回答

4

由於@Reimeus建議,你需要記錄監聽器添加到您的每個文本字段。既然你執行你jButton1ActionPerformed()方法此外,我做了聽衆的通知調用此方法,只要有一個改變你的文本字段。

注意基礎上的評論,我已經更新了我的代碼僅包括一個DocumentListener並還增加了一個DocumentFilter只接受數字輸入。我也刪除了存在於原始代碼來執行求和

這裏的按鈕是你更新的代碼:

import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import javax.swing.text.AbstractDocument; 
import javax.swing.text.AttributeSet; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DocumentFilter; 

public class Frame extends javax.swing.JFrame { 


    public Frame() { 
     initComponents(); 
    } 


    @SuppressWarnings("unchecked") 
    // <editor-fold defaultstate="collapsed" desc="Generated Code"> 
    private void initComponents() { 

     n1 = new javax.swing.JTextField(); 
     n2 = new javax.swing.JTextField(); 
     n3 = new javax.swing.JTextField(); 
     sum = new javax.swing.JTextField(); 
     jLabel1 = new javax.swing.JLabel(); 
     jLabel2 = new javax.swing.JLabel(); 
     jLabel3 = new javax.swing.JLabel(); 
     jLabel5 = new javax.swing.JLabel(); 

     DocumentListener documentListener = new DocumentListener() { 

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

      @Override 
      public void insertUpdate(DocumentEvent e) { 
       performSummation(null); 
      } 

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

     DocumentFilter numericFilter = new DocumentFilter(){ 

      @Override 
      public void insertString(FilterBypass fb, int offset, 
        String string, AttributeSet attr) 
        throws BadLocationException { 
       fb.insertString(offset, string.replaceAll("[^\\d]", ""), attr); 
      } 

      @Override 
      public void replace(FilterBypass fb, int offset, int length, 
        String text, AttributeSet attrs) 
        throws BadLocationException { 

       fb.replace(offset, length, text.replaceAll("[^\\d]", ""), attrs); 
      } 
     }; 

     ((AbstractDocument) n1.getDocument()).setDocumentFilter(numericFilter); 
     ((AbstractDocument) n2.getDocument()).setDocumentFilter(numericFilter); 
     ((AbstractDocument) n3.getDocument()).setDocumentFilter(numericFilter); 

     n1.getDocument().addDocumentListener(documentListener); 
     n2.getDocument().addDocumentListener(documentListener); 
     n3.getDocument().addDocumentListener(documentListener); 


     setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 

     jLabel1.setText("n1"); 
     jLabel2.setText("n2"); 
     jLabel3.setText("n3"); 
     jLabel5.setText("result"); 


     javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 
     getContentPane().setLayout(layout); 
     layout.setHorizontalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addGroup(layout.createSequentialGroup() 
         .addGap(15, 15, 15) 
         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 
          .addComponent(jLabel1) 
          .addComponent(jLabel2) 
          .addComponent(jLabel3))) 
        .addGroup(layout.createSequentialGroup() 
         .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) 
         .addComponent(jLabel5))) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
        .addGroup(layout.createSequentialGroup() 
         .addComponent(sum, javax.swing.GroupLayout.PREFERRED_SIZE, 59, javax.swing.GroupLayout.PREFERRED_SIZE) 
         .addGap(30, 30, 30) 
         .addContainerGap()) 
        .addGroup(layout.createSequentialGroup() 
         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
          .addComponent(n1, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE) 
          .addComponent(n2, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE) 
          .addComponent(n3, javax.swing.GroupLayout.PREFERRED_SIZE, 50, javax.swing.GroupLayout.PREFERRED_SIZE)) 
         .addGap(0, 0, Short.MAX_VALUE)))) 
     ); 
     layout.setVerticalGroup(
      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 
      .addGroup(layout.createSequentialGroup() 
       .addGap(32, 32, 32) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING) 
        .addGroup(layout.createSequentialGroup() 
         .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
          .addComponent(n1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
          .addComponent(jLabel1)) 
         .addGap(10, 10, 10) 
         .addComponent(n2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)) 
        .addComponent(jLabel2)) 
       .addGap(20, 20, 20) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(n3, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(jLabel3)) 
       .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) 
       .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE) 
        .addComponent(sum, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) 
        .addComponent(jLabel5)) 
       .addContainerGap(38, Short.MAX_VALUE)) 
     ); 

     pack(); 
    }// </editor-fold> 

    private void performSummation(java.awt.event.ActionEvent evt) { 
     int total = 0; 
     if(n1.getText().trim().length() > 0){ 
      try{ 
       total += Integer.parseInt(n1.getText()); 
      }catch(NumberFormatException nbx){ 
      } 
     } 

     if(n2.getText().trim().length() > 0){ 
      try{ 
       total += Integer.parseInt(n2.getText()); 
      }catch(NumberFormatException nbx){ 
      } 
     } 

     if(n3.getText().trim().length() > 0){ 
      try{ 
       total += Integer.parseInt(n3.getText()); 
      }catch(NumberFormatException nbx){ 
      } 
     } 

     sum.setText(""+total); 

    } 

    public static void main(String args[]) { 
     /* Set the Nimbus look and feel */ 
     //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 
     /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 
     * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
     */ 
     try { 
      for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 
       if ("Nimbus".equals(info.getName())) { 
        javax.swing.UIManager.setLookAndFeel(info.getClassName()); 
        break; 
       } 
      } 
     } catch (ClassNotFoundException ex) { 
      java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (InstantiationException ex) { 
      java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (IllegalAccessException ex) { 
      java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } catch (javax.swing.UnsupportedLookAndFeelException ex) { 
      java.util.logging.Logger.getLogger(Frame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 
     } 
     //</editor-fold> 

     /* Create and display the form */ 
     java.awt.EventQueue.invokeLater(new Runnable() { 
      public void run() { 
       new Frame().setVisible(true); 
      } 
     }); 
    } 
    // Variables declaration - do not modify 
    private javax.swing.JLabel jLabel1; 
    private javax.swing.JLabel jLabel2; 
    private javax.swing.JLabel jLabel3; 
    private javax.swing.JLabel jLabel5; 
    private javax.swing.JTextField n1; 
    private javax.swing.JTextField n2; 
    private javax.swing.JTextField n3; 
    private javax.swing.JTextField sum; 
    // End of variables declaration 
} 

幾個指針:

  • 永遠不要相信輸入端,來自用戶。有用戶可能輸入不正確的值(說的東西是不是一個整數)的可能性。因此,驗證輸入並檢查輸入是否可以實際分析總是一個好主意。牢記這一點,I'ved更新您的jButton1ActionPerformed()方法

  • 另一種方法是使用一個Formatted Text Fields

+0

也是有用的一個'DocumentFilter'。這會在用戶鍵入時進行驗證,並且您可以以這種方式禁止編輯。查看[本論壇帖子](http://www.coderanch.com/t/345628/GUI/java/DocumentFilter)爲例。 – Brian

+0

@Sujay嘿,非常感謝,你真棒。我只是有一個疑問,如果我想擺脫計算按鈕,我應該在哪裏放置新的代碼?再次,謝謝你。 –

+0

@AlexTerreaux:恩'jButton1ActionPerformed()'只是一個方法。您可以將該方法重命名爲任何您喜歡的。刪除按鈕將不得不在你的代碼實現:) – Sujay

4

你所尋找的是一個DocumentListener

註冊與每個JTextFieldsn1n2n3並調用你的方法jButton1ActionPerformed更新結果字段的聽衆。

2

這種替代approach使用PropertyChangeListener和使用JFormattedTextField值的FocusListenerupdate()的總和。

0

您可以使用一個焦點偵聽器,或者你可以使用一個動作監聽輸入JTextField