2

i want count the line number of JTextArea include the wrapped text. And I got the nice sample code from Here Thread

But i try to modified using Dynamic JTextArea. But the calculation of line number goes wrong.

Here is the code modified by me :

package fandi.demo;

import java.awt.font.FontRenderContext;
import java.awt.font.LineBreakMeasurer;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;
import javax.swing.JTextArea;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class JTextAreaCountModified extends javax.swing.JFrame {

    public JTextAreaCountModified() {
        initComponents();
        setLocationRelativeTo(null);

        txtResult.getDocument().addDocumentListener(new DocumentListener() {

            @Override
            public void insertUpdate(DocumentEvent e) {
                if(txtResult.getText().length() > 0) {
                    lblCountLine.setText(String.valueOf(countLines(txtResult)));
                } else {
                    lblCountLine.setText("0");
                }
            }

            @Override
            public void removeUpdate(DocumentEvent e) {
                if(txtResult.getText().length() > 0) {
                    lblCountLine.setText(String.valueOf(countLines(txtResult)));
                }else {
                    lblCountLine.setText("0");
                }
            }

            @Override
            public void changedUpdate(DocumentEvent e) {
                if(txtResult.getText().length() > 0) {
                    lblCountLine.setText(String.valueOf(countLines(txtResult)));
                }else {
                    lblCountLine.setText("0");
                }
            }
        });
    }

    // COUNTING LINE GOES HERE...
    public static int countLines(JTextArea textArea) {
        AttributedString text = new AttributedString(textArea.getText());
        FontRenderContext frc = textArea.getFontMetrics(textArea.getFont()).getFontRenderContext();
        AttributedCharacterIterator charIt = text.getIterator();
        LineBreakMeasurer lineMeasurer = new LineBreakMeasurer(charIt, frc);
        float formatWidth = (float) textArea.getSize().width;
        lineMeasurer.setPosition(charIt.getBeginIndex());

        int noLines = 0;
        while (lineMeasurer.getPosition() < charIt.getEndIndex()) {
            lineMeasurer.nextLayout(formatWidth);
            noLines++;
        }

        int lineEnter = textArea.getLineCount();
        int countLine = noLines + lineEnter;

        return countLine-1;
    } 
    // END OF COUNTING METHOD

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jScrollPane1 = new javax.swing.JScrollPane();
        txtResult = new javax.swing.JTextArea();
        jLabel3 = new javax.swing.JLabel();
        lblCountLine = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("JTextArea Line Counting include Wrap");
        setResizable(false);

        jLabel1.setText("Enter paragraph");

        jLabel2.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        jLabel2.setForeground(new java.awt.Color(255, 0, 0));
        jLabel2.setText("20 line limit.");

        txtResult.setColumns(20);
        txtResult.setLineWrap(true);
        txtResult.setRows(5);
        txtResult.setWrapStyleWord(true);
        jScrollPane1.setViewportView(txtResult);

        jLabel3.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
        jLabel3.setText("Information : ");

        lblCountLine.setText("...");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel3)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(lblCountLine)
                        .addGap(0, 0, Short.MAX_VALUE))
                    .addGroup(layout.createSequentialGroup()
                        .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(jScrollPane1, javax.swing.GroupLayout.DEFAULT_SIZE, 458, Short.MAX_VALUE)
                            .addGroup(layout.createSequentialGroup()
                                .addComponent(jLabel1)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(jLabel2)
                                .addGap(0, 0, Short.MAX_VALUE)))
                        .addContainerGap())))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel1)
                    .addComponent(jLabel2))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 290, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel3)
                    .addComponent(lblCountLine))
                .addContainerGap(13, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    /**
     * @param args the command line arguments
     */
    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(JTextAreaCountModified.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(JTextAreaCountModified.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(JTextAreaCountModified.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(JTextAreaCountModified.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 JTextAreaCountModified().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JLabel lblCountLine;
    private javax.swing.JTextArea txtResult;
    // End of variables declaration//GEN-END:variables
}

Please help, thank you :)

Community
  • 1
  • 1
fanjavaid
  • 1,676
  • 8
  • 34
  • 65
  • 1
    * goes wrong.* can you please explain ? – Suresh Atta Jul 13 '13 at 06:49
  • Sorry, i mean , example the number of rows should be 10, but the calculation to 11. And one more in the middle of the sentence ,always detected as new line. May be you can try my code above. Thanks before :) – fanjavaid Jul 13 '13 at 07:13
  • 1
    I don't have time to test it, but JTextArea has a getLineCount method that may do it. In the case it doesn't count wrapped lines, you can use getColumns method in this way: textArea.getText().length() / textArea.getColumns(). So simple, so easy. – Igor Rodriguez Jul 13 '13 at 07:56

2 Answers2

4

See the getWrappedLines() method from Text Utilities.

camickr
  • 321,443
  • 19
  • 166
  • 288
2
  • there are another one, two different ways, but I used loop inside lines,

.

import java.awt.BorderLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.Element;

public class ResizeJTextArea {

    private JFrame frame = new JFrame();
    private JScrollPane scrollPane = new JScrollPane();
    private JTextArea textArea = new JTextArea(15, 15);
    private JButton button = new JButton("change");
    private Font newFont = new Font("Courier", Font.PLAIN, 10);

    public ResizeJTextArea() {
        textArea.setText("This is just a line of text, "
                + "This is just a line of text, This is just a line of text, "
                + "This is just a line of text,\nThis is just a line of text,"
                + "This is just a line of text, This is just a line of text,"
                + "\nThis is just a line of text,This is just a line of text, "
                + "This is just a line of text,\nThis is just a line of text,"
                + "This is just a line of text, This is just a line of text,"
                + "\nThis is just a line of text, This is just a line of text,"
                + "\nThis is just a line of text,");
        textArea.setLineWrap(true);
        textArea.setWrapStyleWord(true);
        textArea.setFont(newFont);
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                textArea.setFont(textArea.getFont().deriveFont(20f));
                frame.pack();
            }
        });
        scrollPane.setViewportView(textArea);
        frame.add(scrollPane);
        frame.add(button, BorderLayout.SOUTH);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setLocation(100, 100);
        frame.pack();
        frame.setVisible(true);
        Element paragraph = textArea.getDocument().getDefaultRootElement();
        int contentCount = paragraph.getElementCount();
        for (int i = 0; i < contentCount; i++) {
            Element e = paragraph.getElement(i);
            int rangeStart = e.getStartOffset();
            int rangeEnd = e.getEndOffset();
            String line;
            try {
                line = textArea.getText(rangeStart, rangeEnd - rangeStart);
                System.out.println(line);
            } catch (BadLocationException ex) {
                Logger.getLogger(ResizeJTextArea.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                ResizeJTextArea fs = new ResizeJTextArea();
            }
        });
    }
}
mKorbel
  • 109,525
  • 20
  • 134
  • 319