当前位置: 首页 > 面试题库 >

如何计算JTextArea中的行数,包括换行引起的行数?

潘泰
2023-03-14
问题内容

我有一个JTextArea,我为此设置了自动换行和自动换行的单词。我想将JTextArea“打包”到指定宽度的最小可能高度。

为此,我计划使用…计算字体的高度。

  Font font = jTextArea.getFont();
  FontMetrics fontMetrics = jTextArea.getFontMetrics(font);
  int lineHeight = fontMetrics.getAscent() + fontMetrics.getDescent();

…然后将其乘以JTextArea中使用的行数。问题是JTextArea.getLineCount()计算返回的行数而忽略换行。

如何计算JTextArea中使用的行数,包括由自动换行引起的行数?

这里有一些演示代码,可以使解决这个问题变得更加容易。我有一个侦听器,它在每次调整窗口大小时都会打印出行数。目前,它总是打印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();                                                                   
      }                                                                                       
    });                                                                                       
  }                                                                                           
}

问题答案:

您可以使用LineBreakMeasurerClass。

LineBreakMeasurer类允许将样式化的文本分成适合特定视觉效果的线(或段)。这对于希望显示适合特定宽度的文本段落(称为换行宽度)的客户很有用。LineBreakMeasurer实施最常用的换行策略:将适合换行宽度的每个单词放在行上。如果第一个单词不合适,则将所有适合在包装宽度内的字符放在行上。每行至少放置一个字符。



 类似资料:
  • 问题内容: 假设我要计算项目中的代码行数。如果所有文件都在同一目录中,则可以执行: 但是,如果有子目录,则无法使用。为此,cat必须具有递归模式。我怀疑这可能是xargs的工作,但我想知道是否还有更优雅的解决方案? 问题答案: 首先,您不需要使用行数。这是一种称为猫的无用使用(UUoC)的反模式。要计算当前目录中文件的行数,请使用: 然后,该命令递归子目录: 是要从中开始搜索的顶层目录的名称 是您

  • 我正在尝试为一个服务制作一个GUI,它有一个JTextArea来查看消息,每条消息都写在一行上,如果需要的话还会进行文字包装。 消息通过一个套接字到达,所以我只使用一个.append(消息)来更新JTextArea,我需要将这些行限制为50或100,我不需要限制每行的字符数。 编辑 问题是每个客户端可以发送无限行,所有这些行都必须是可读的,所以这不是简单地检查JTextArea中的行数。我需要删除

  • 问题内容: 我有这样的台词,我想知道我实际上有几行… 有没有一种方法可以使用linux命令对它们进行计数? 问题答案: 用途: 这将输出行数: 或者,要从结果中省略,请使用: 您还可以通过管道将数据发送到:

  • 问题内容: 有没有一种可靠的方法来计算字符串如何在JTextArea中划分为行? 我有一个固定宽度的JTextArea,当它被填充时,会添加一个新行并垂直扩展。 现在,我需要确切地知道哪一行中的字符。我可以使用字体指标来计算单个字符的宽度,但是我不知道这是否可靠,或者是否有更好的方法。 字体指标是“绝招”吗? 问题答案: 所有JTextComponent都具有和可以提供帮助的方法,但也许更好的是j

  • 有没有可靠的方法来计算一个字符串在JTextArea中是如何划分成行的? 我有一个固定宽度的JTextArea,当它被填充时,就会添加一个新行,并且它会垂直扩展。 现在,我需要确切地知道哪些字符在哪一行。我可以使用字体度量来增加单个字符的宽度,但我不知道这是否可靠,或者是否有更好的方法。 字体度量“诡计”是唯一的方法吗?

  • 有时它可以返回多个结果。因此,我不认为会起作用。 如何在Python中计算行数?就像在PHP中一样,我可以使用。 我找不到任何方法来做这件事。我正在使用Python3。 我对python MySQL绝对是新手。我对PHP中的MySQL真的很熟悉。 您可以使用来实现。但是,出于我的好奇:有没有方法直接使用pymysql来实现它?