在Java8中,如果我将JTextPane的宽度设置为与FontMetrics.stringWidth返回的值相匹配,则文本将精确匹配并绘制在一行上。但是,在Java 17中,使用相同的代码,文本中的最后一个单词是换行的。下面是我的代码:
import java.awt.*;
import javax.swing.*;
public class SimpleTest {
public static void main(String[] args) {
SwingUtilities.invokeLater(SimpleTest::test);
}
private static void test() {
Test test = new Test();
JPanel panel = new JPanel(new BorderLayout());
panel.add(test);
JFrame frame = new JFrame();
frame.setContentPane(panel);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(250, 100);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private static class Test extends JComponent {
private static final long serialVersionUID = 1L;
private JTextPane textPane;
private Test() {
textPane = new JTextPane();
textPane.setFont(new Font("Arial", Font.BOLD, 24));
textPane.setBorder(null);
textPane.setContentType("text/plain");
}
@Override
protected void paintComponent(Graphics g) {
String labelText = "THIS IS A TEST";
textPane.setText(labelText);
textPane.setLocation(new Point(0, 0));
FontMetrics fm = textPane.getFontMetrics(textPane.getFont());
int width = fm.stringWidth(labelText);
int height = fm.getHeight();
textPane.setSize(width, height);
Graphics2D g2D = (Graphics2D) g.create(0, 0, width, height * 2);
textPane.paint(g2D);
g2D.dispose();
}
}
}Java 8:

Java 17:

是否有可能使行为保持一致?
发布于 2021-09-10 19:32:41
要获得宽度,调用以下命令:
int width = textPane.getPreferredSize().width;不是这样的:
int width = fm.stringWidth(labelText);发布于 2021-08-21 01:04:28
我不知道它的细节,但我百分之百确定在Java8中的方法fm.stringWidth(labelText)比在Java11中多1,因为如果我执行fm.stringWidth(labelText)+1,那么换行就可以了。只需更改这一行,您的代码就会正常工作。
如果有帮助,请让我知道。
https://stackoverflow.com/questions/68865993
复制相似问题