java – 如何计算JTextArea中的行数,包括由包装引起的行数?
| 
                         我有一个JTextArea,我已经设置了word-wrap和wrap-style-word为true.我想将JTextArea“包装”到给定指定宽度的最小可能高度. 为了做到这一点,我计划使用…来计算字体的高度 Font font = jTextArea.getFont(); FontMetrics fontMetrics = jTextArea.getFontMetrics(font); int lineHeight = fontMetrics.getAscent() + fontMetrics.getDescent(); …然后将其乘以JTextArea中使用的行数.问题是JTextArea.getLineCount()计算忽略包装线的行返回数. 如何计算JTextArea中使用的行数,包括由word wrap引起的行数? 这里有一些演示代码让这个问题变得更容易.我有一个监听器,每次窗口调整大小时打印出行数.目前,它总是打印1,但是我想要补偿单词包装,并打印出实际使用了多少行. 编辑:我在下面的代码中包含了问题的解决方案.静态countLines方法给出了解决方案. package components;                                                                           
import java.awt.*;
import java.awt.event.*;
import java.awt.font.*;
import java.text.*;
import javax.swing.*;
public class JTextAreaLineCountDemo extends JPanel {                                          
  JTextArea textArea;                                                                         
  public JTextAreaLineCountDemo() {                                                           
    super(new GridBagLayout());                                                               
    String inputStr = "Lorem ipsum dolor sit amet,consectetur adipisicing elit,sed do eiusmo";
    textArea = new JTextArea(inputStr);                                                       
    textArea.setEditable(false);                                                              
    textArea.setLineWrap(true);                                                               
    textArea.setWrapStyleWord(true);                                                          
    // Add Components to this panel.                                                          
    GridBagConstraints c = new GridBagConstraints();                                          
    c.gridwidth = GridBagConstraints.REMAINDER;                                               
    c.fill = GridBagConstraints.BOTH;                                                         
    c.weightx = 1.0;                                                                          
    c.weighty = 1.0;                                                                          
    add(textArea,c);                                                                         
    addComponentListener(new ComponentAdapter() {                                             
      @Override                                                                               
      public void componentResized(ComponentEvent ce) {                 
        System.out.println("Line count: " + countLines(textArea));                         
      }                                                                                       
    });                                                                                       
  }                                                                                           
  private 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++;
    }
    return noLines;
  }
  private static void createAndShowGUI() {                                                    
    JFrame frame = new JFrame("JTextAreaLineCountDemo");                                      
    frame.setDefaultCloSEOperation(JFrame.EXIT_ON_CLOSE);                                     
    frame.add(new JTextAreaLineCountDemo());                                                  
    frame.pack();                                                                             
    frame.setVisible(true);                                                                   
  }                                                                                           
  public static void main(String[] args) {                                                    
    javax.swing.SwingUtilities.invokeLater(new Runnable() {                                   
      public void run() {                                                                     
        createAndShowGUI();                                                                   
      }                                                                                       
    });                                                                                       
  }                                                                                           
}
解决方法您可以使用LineBreakMeasurer类. 
  
  
 
 (编辑:莱芜站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!  | 
                  
