我已经使用其他优秀答案来设计一种方法,该方法使用LineBreakMeasurer
返回JTextPane
(考虑其内容和宽度)的正确尺寸。使用LineBreakMeasurer计算线条并更改字体大小
问题是,当我尝试不同的字体大小时,它有点小,我找不出原因。它适用于说Arial 12,但不适用于Arial 8或Arial 16,因为然后nextLayout
计算长度错误。谁能告诉我为什么?
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.FontMetrics;
import java.awt.font.FontRenderContext;
import java.awt.font.LineBreakMeasurer;
import java.awt.font.TextLayout;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextPane;
import javax.swing.border.LineBorder;
public class Example1 {
static JFrame frame = new JFrame();
static JPanel bigPanel = new JPanel();
static JTextPane textPane[] = new JTextPane[10];
public static void main(String[] args) {
frame.setLayout(new FlowLayout());
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
for(int i=0 ; i<10 ; i++) {
textPane[i] = new JTextPane();
textPane[i].setFont(new Font("Arial", 0, 12+i));
textPane[i].setText("This is 10 characters of " + ((Integer)(10+i)).toString() + " points : a b c d e f g h i j");
textPane[i].setPreferredSize(getTextDimension(textPane[i], 100));
textPane[i].setBorder(new LineBorder(Color.BLACK));
frame.add(textPane[i]);
}
frame.setSize(500, 500);
frame.setVisible(true);
}
static private Dimension getTextDimension(JTextPane textPane, float width) {
FontMetrics fm = textPane.getFontMetrics(textPane.getFont());
int fontHeight = fm.getHeight()+ fm.getDescent();
//int fontHeight = fm.getHeight();
AttributedString text = new AttributedString(textPane.getText());
FontRenderContext frc = textPane.getFontMetrics(textPane.getFont()).getFontRenderContext();
AttributedCharacterIterator styledText = text.getIterator();
LineBreakMeasurer measurer = new LineBreakMeasurer(styledText, frc);
float wrappingWidth = width - textPane.getInsets().left - textPane.getInsets().right;
int lines = 0;
while (measurer.getPosition() < styledText.getEndIndex()) {
TextLayout layout = measurer.nextLayout(wrappingWidth);
lines++;
}
return new Dimension((int)Math.round(width), lines * fontHeight);
}
}
请引用相关答案并编辑您的问题以包含展示您描述的问题的[sscce](http://sscce.org/)。 – trashgod
我已经编辑了示例到sscce,这表明当字体大小增加时(即使包含字体上升和下降),计算稍微偏离 – whetstone
[sscce] +1(http://sscce.org/)。还要考虑'WindowAdapter'或'setDefaultCloseOperation()'。 – trashgod