java是如何计算行数的_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();

}

});

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值