Value Change Listener to JTextField

前端 未结 12 1951
情歌与酒
情歌与酒 2020-11-22 04:16

I want the message box to appear immediately after the user changes the value in the textfield. Currently, I need to hit the enter key to get the message box to pop out. Is

相关标签:
12条回答
  • 2020-11-22 04:21

    Use a KeyListener (which triggers on any key) rather than the ActionListener (which triggers on enter)

    0 讨论(0)
  • 2020-11-22 04:23

    You can use even "MouseExited" to control. example:

     private void jtSoMauMouseExited(java.awt.event.MouseEvent evt) {                                    
            // TODO add your handling code here:
            try {
                if (Integer.parseInt(jtSoMau.getText()) > 1) {
                    //auto update field
                    SoMau = Integer.parseInt(jtSoMau.getText());
                    int result = SoMau / 5;
    
                    jtSoBlockQuan.setText(String.valueOf(result));
                }
            } catch (Exception e) {
    
            }
    
        }   
    
    0 讨论(0)
  • 2020-11-22 04:28

    Just create an interface that extends DocumentListener and implements all DocumentListener methods:

    @FunctionalInterface
    public interface SimpleDocumentListener extends DocumentListener {
        void update(DocumentEvent e);
    
        @Override
        default void insertUpdate(DocumentEvent e) {
            update(e);
        }
        @Override
        default void removeUpdate(DocumentEvent e) {
            update(e);
        }
        @Override
        default void changedUpdate(DocumentEvent e) {
            update(e);
        }
    }
    

    and then:

    jTextField.getDocument().addDocumentListener(new SimpleDocumentListener() {
        @Override
        public void update(DocumentEvent e) {
            // Your code here
        }
    });
    

    or you can even use lambda expression:

    jTextField.getDocument().addDocumentListener((SimpleDocumentListener) e -> {
        // Your code here
    });
    
    0 讨论(0)
  • 2020-11-22 04:28
    textBoxName.getDocument().addDocumentListener(new DocumentListener() {
       @Override
       public void insertUpdate(DocumentEvent e) {
           onChange();
       }
    
       @Override
       public void removeUpdate(DocumentEvent e) {
          onChange();
       }
    
       @Override
       public void changedUpdate(DocumentEvent e) {
          onChange();
       } 
    });
    

    But I would not just parse anything the user (maybe on accident) touches on his keyboard into an Integer. You should catch any Exceptions thrown and make sure the JTextField is not empty.

    0 讨论(0)
  • 2020-11-22 04:30

    The usual answer to this is "use a DocumentListener". However, I always find that interface cumbersome. Truthfully the interface is over-engineered. It has three methods, for insertion, removal, and replacement of text, when it only needs one method: replacement. (An insertion can be viewed as a replacement of no text with some text, and a removal can be viewed as a replacement of some text with no text.)

    Usually all you want is to know is when the text in the box has changed, so a typical DocumentListener implementation has the three methods calling one method.

    Therefore I made the following utility method, which lets you use a simpler ChangeListener rather than a DocumentListener. (It uses Java 8's lambda syntax, but you can adapt it for old Java if needed.)

    /**
     * Installs a listener to receive notification when the text of any
     * {@code JTextComponent} is changed. Internally, it installs a
     * {@link DocumentListener} on the text component's {@link Document},
     * and a {@link PropertyChangeListener} on the text component to detect
     * if the {@code Document} itself is replaced.
     * 
     * @param text any text component, such as a {@link JTextField}
     *        or {@link JTextArea}
     * @param changeListener a listener to receieve {@link ChangeEvent}s
     *        when the text is changed; the source object for the events
     *        will be the text component
     * @throws NullPointerException if either parameter is null
     */
    public static void addChangeListener(JTextComponent text, ChangeListener changeListener) {
        Objects.requireNonNull(text);
        Objects.requireNonNull(changeListener);
        DocumentListener dl = new DocumentListener() {
            private int lastChange = 0, lastNotifiedChange = 0;
    
            @Override
            public void insertUpdate(DocumentEvent e) {
                changedUpdate(e);
            }
    
            @Override
            public void removeUpdate(DocumentEvent e) {
                changedUpdate(e);
            }
    
            @Override
            public void changedUpdate(DocumentEvent e) {
                lastChange++;
                SwingUtilities.invokeLater(() -> {
                    if (lastNotifiedChange != lastChange) {
                        lastNotifiedChange = lastChange;
                        changeListener.stateChanged(new ChangeEvent(text));
                    }
                });
            }
        };
        text.addPropertyChangeListener("document", (PropertyChangeEvent e) -> {
            Document d1 = (Document)e.getOldValue();
            Document d2 = (Document)e.getNewValue();
            if (d1 != null) d1.removeDocumentListener(dl);
            if (d2 != null) d2.addDocumentListener(dl);
            dl.changedUpdate(null);
        });
        Document d = text.getDocument();
        if (d != null) d.addDocumentListener(dl);
    }
    

    Unlike with adding a listener directly to the document, this handles the (uncommon) case that you install a new document object on a text component. Additionally, it works around the problem mentioned in Jean-Marc Astesana's answer, where the document sometimes fires more events than it needs to.

    Anyway, this method lets you replace annoying code which looks like this:

    someTextBox.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void insertUpdate(DocumentEvent e) {
            doSomething();
        }
    
        @Override
        public void removeUpdate(DocumentEvent e) {
            doSomething();
        }
    
        @Override
        public void changedUpdate(DocumentEvent e) {
            doSomething();
        }
    });
    

    With:

    addChangeListener(someTextBox, e -> doSomething());
    

    Code released to public domain. Have fun!

    0 讨论(0)
  • 2020-11-22 04:31

    Add a listener to the underlying Document, which is automatically created for you.

    // Listen for changes in the text
    textField.getDocument().addDocumentListener(new DocumentListener() {
      public void changedUpdate(DocumentEvent e) {
        warn();
      }
      public void removeUpdate(DocumentEvent e) {
        warn();
      }
      public void insertUpdate(DocumentEvent e) {
        warn();
      }
    
      public void warn() {
         if (Integer.parseInt(textField.getText())<=0){
           JOptionPane.showMessageDialog(null,
              "Error: Please enter number bigger than 0", "Error Message",
              JOptionPane.ERROR_MESSAGE);
         }
      }
    });
    
    0 讨论(0)
提交回复
热议问题