Как показать длину текста во время выполнения, даже если он был отредактирован и удален в программировании Java gui?

#java

#java

Вопрос:

Проблема в том, как показать длину текста во время выполнения, даже если он был отредактирован или удален в программировании с графическим интерфейсом Java. Пожалуйста, помогите решить проблему.

Итак, вот код:

 area1.getDocument().addDocumentListener(new DocumentListener() {
        @Override
        public void insertUpdate(DocumentEvent e) {
            update();

        }

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

        @Override
        public void changedUpdate(DocumentEvent e) {
            update();
        }
        public void update()
        {
            lblLength.setText(area1.getText().length() "160");
        }
    });
 

Комментарии:

1. Длина в количестве символов, длина в пикселях? Какая длина? Как насчет примера?

2. Ваш вопрос неясен, можете ли вы уточнить или, возможно, показать какой-то код и что не работает?

3. И что не работает?

Ответ №1:

Если все, что вы хотите сделать, это отслеживать длину содержимого JTextArea , то DocumentListener это правильный подход, например…

введите описание изображения здесь

 import java.awt.BorderLayout;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;
import javax.swing.text.Document;

public class TextAreaLength {

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

    private JLabel lengthLabel;
    private JTextArea ta;

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

                ta = new JTextArea(10, 20);
                ta.setWrapStyleWord(true);
                ta.setLineWrap(true);
                lengthLabel = new JLabel("0");
                ta.getDocument().addDocumentListener(new DocumentListener() {

                    @Override
                    public void insertUpdate(DocumentEvent e) {
                        update(e.getDocument());
                    }

                    @Override
                    public void removeUpdate(DocumentEvent e) {
                        update(e.getDocument());
                    }

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

                    protected void update(Document doc) {
                        lengthLabel.setText(Integer.toString(doc.getLength()));
                    }

                });
                lengthLabel.setHorizontalAlignment(JLabel.RIGHT);

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

}
 

Если это не работает для вас, то либо вы сделали что-то еще неправильно в своем коде, что вы нам не показываете, либо вы недостаточно четко сформулировали проблему, чтобы мы могли понять

Ответ №2:

На самом деле это неправильно, и его не следует делать таким образом, но я оставлю это здесь для дальнейшего использования

Довольно просто. У вас просто есть прослушиватель с ключом, и каждый раз, когда он запускается, вы обновляете количество символов.

 public class NewJFrame extends javax.swing.JFrame {

    public NewJFrame() {
        initComponents();
    }

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

        jMainPanel = new javax.swing.JPanel();
        jCharsTextField = new javax.swing.JTextField();
        jCharsNumLabel = new javax.swing.JLabel();
        jCharsNumCounterLabel = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jCharsTextField.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyTyped(java.awt.event.KeyEvent evt) {
                jCharsTextFieldKeyTyped(evt);
            }
        });

        jCharsNumLabel.setText("Chars #:");

        jCharsNumCounterLabel.setText(" ");

        javax.swing.GroupLayout jMainPanelLayout = new javax.swing.GroupLayout(jMainPanel);
        jMainPanel.setLayout(jMainPanelLayout);
        jMainPanelLayout.setHorizontalGroup(
            jMainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jMainPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jMainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                    .addComponent(jCharsTextField)
                    .addComponent(jCharsNumLabel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jCharsNumCounterLabel, javax.swing.GroupLayout.PREFERRED_SIZE, 27, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(303, Short.MAX_VALUE))
        );
        jMainPanelLayout.setVerticalGroup(
            jMainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jMainPanelLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jCharsTextField, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jMainPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jCharsNumLabel)
                    .addComponent(jCharsNumCounterLabel))
                .addContainerGap(242, Short.MAX_VALUE))
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jMainPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jMainPanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );

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

    private void jCharsTextFieldKeyTyped(java.awt.event.KeyEvent evt) {                                         
        jCharsNumCounterLabel.setText(Integer.toString(jCharsTextField.getText().length()));
    }                                        

    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(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.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 NewJFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JLabel jCharsNumCounterLabel;
    private javax.swing.JLabel jCharsNumLabel;
    private javax.swing.JTextField jCharsTextField;
    private javax.swing.JPanel jMainPanel;
    // End of variables declaration                   
}
 

Это ваша точка зрения:

 private void jCharsTextFieldKeyTyped(java.awt.event.KeyEvent evt) {                                         
        jCharsNumCounterLabel.setText(Integer.toString(jCharsTextField.getText().length()));
    } 
 

Комментарии:

1. Вы никогда не должны использовать KeyListener с текстовыми компонентами, он может быть использован до вашего уведомления и не учитывает вставку пользователем текста в поле. Использование DocumentListener, демонстрируемого OP, на самом деле является правильным средством

2. @user3741964 проверьте ответ MadProgrammer, это правильный путь.