2012-09-18 23 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