如何在启用换行的情况下获取JTextArea中的可见行数?

时间:2014-12-19 03:33:28

标签: java swing jtextarea

我想知道当换行设置为true时如何在JTextArea中获取可见行数?

1 个答案:

答案 0 :(得分:3)

您对“可见线”的定义是什么?例如,如果:

  1. 显示一半的一行。是否算作一条线?
  2. 显示包裹线的一半。是否算作一条线?
  3. 无论如何,我认为接近的方法是使用视口的位置和viewToModel()方法来获取视口中显示的第一行和最后一行文本的偏移量。

    然后,您可以使用文档的Element结构来确定这些偏移的行号。一旦知道了行号,就可以计算行号之间的差异。

    最后,根据您对上述问题的回答,您可以根据需要调整行号。

    以下是帮助您入门的基础知识:

    import java.awt.*;
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.text.*;
    import java.io.*;
    
    public class TestTextArea {
    
        public static void main(String[] args) {
            new TestTextArea();
        }
    
        public TestTextArea() {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
    
                    JFrame frame = new JFrame();
                    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                    frame.setLayout(new BorderLayout());
                    frame.add(new TestTextAreaPane());
                    frame.pack();
                    frame.setLocationRelativeTo(null);
                    frame.setVisible(true);
                }
            });
        }
    
        public class TestTextAreaPane extends JPanel {
    
            private JTextArea textArea;
    
            public TestTextAreaPane() {
                setLayout(new BorderLayout());
                textArea = new JTextArea(20, 100);
                textArea.setWrapStyleWord(true);
                textArea.setLineWrap(true);
    
                try
                {
                    FileReader reader = new FileReader( "TestTextArea.java" );
                    BufferedReader br = new BufferedReader(reader);
                    textArea.read( br, null );
                    br.close();
                }
                catch(Exception e2) { System.out.println(e2); }
    
                JScrollPane scrollPane = new JScrollPane(textArea);
                add(scrollPane);
                scrollPane.getViewport().addChangeListener(new ChangeListener() {
                    @Override
                    public void stateChanged(ChangeEvent e) {
                        if (textArea.getText().length() > 0) {
                            JViewport viewport = (JViewport) e.getSource();
                            Rectangle viewRect = viewport.getViewRect();
    
                            Point p = viewRect.getLocation();
                            int startIndex = textArea.viewToModel(p);
    
                            int lineHeight = textArea.getFontMetrics( textArea.getFont() ).getHeight();
                            p.y += viewRect.height - lineHeight;
                            int endIndex = textArea.viewToModel(p);
    
                            Element root = textArea.getDocument().getDefaultRootElement();
                            int startLine =  root.getElementIndex( startIndex );
                            int endLine =  root.getElementIndex( endIndex );
                            int lines = endLine - startLine + 1;
                            System.out.println(lines);
                        }
                    }
                });
            }
        }
    }