我想知道当换行设置为true时如何在JTextArea
中获取可见行数?
答案 0 :(得分: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);
}
}
});
}
}
}