Java:如何将绘制的文本动态适应窗口

Posted

技术标签:

【中文标题】Java:如何将绘制的文本动态适应窗口【英文标题】:Java: How to dynamically fit painted text into window 【发布时间】:2011-01-11 13:06:25 【问题描述】:

我试图在我的框架/组件上绘制一个大的“hello world”。 但我想动态地适应窗口大小。所以每次我调整窗口大小时,文本都应该完全适合窗口。

我使用 FontMetrics 类,我为其分配了字体并测量字符的宽度和高度。

但是最好有一个方法,我通过文本传递组件的大小,并且该方法返回我需要使用的字体。好吧,特定字体的字体大小就足够了。

类似这样的:

public int getFontSizeForDrawArea( int width, int height, String text, Font font) 
  //Pseudo class FontMeasureClass takes a font to do the measures with
  FontMeasureClass measure = new FontMeasureClass( font);

  // method takes size of frame/component and text to return the needed 
  // font size to fit text to frame/component
  return measure.getFontSize( width, height, text);

我考虑制作一种方法来测量文本的大小,通过循环尝试直到大小与窗口宽度和高度尽可能接近。但也许有一些东西可以使用。

【问题讨论】:

【参考方案1】:

您可以计算宽度并以大字体绘制文本,然后使用Graphics2D.scale 将其缩小。通常,paintComponent-Method 接收一个 Graphics2D 对象,因此您可以将获得的 Graphics 对象转换为 Graphics2D。

【讨论】:

虽然 Java 的字体渲染器不是特别好,但是用不同的大小渲染文本然后调整它的大小可能会导致图像质量比使用正确大小的字体渲染时差得多。 我理解 OP 希望“完美”地适合所有帧大小的文本的问题。当不断调整窗口大小时,试图找到最适合的文本大小会导致“大小跳跃”。我想不出另一种方法来做到这一点。另外,我认为缩小大文本比放大小文本会产生更好的质量。一个组合的解决方案是找到“有点太大”的文本大小,然后稍微缩小以该大小绘制的文本,但我不知道这样看起来是否更好。 从 Java 6 开始,在启用子像素 AA 的情况下,以这种方式缩放可以完美呈现。【参考方案2】:

以像素为单位测量字符串宽度的一种方法是:

Font myfont = jTextField1.getFont();      
FontMetrics myMetrics = getFontMetrics(myfont);
int width=SwingUtilities.computeStringWidth(myMetrics, jTextField1.getText()); 

这是另一个,它还计算它的高度(以像素为单位):

Font myFont = new Font("Arial", Font.PLAIN, 10);
FontMetrics myMetrics = new FontMetrics(myFont) ;
Rectangle2D boundsOfString = myMetrics.getStringBounds("Measure this String", null);
int width = (int) boundsOfString.getWidth();
int height = (int) boundsOfString.getHeight();

我会用你上面提到的循环来做。

【讨论】:

好吧,当返回的宽度最接近窗口宽度时,我仍然需要循环并停止。 是的。循环应该很容易制作。我不知道还有其他方法。 为什么同一个人有两个答案而不是编辑原始答案? 我将两个答案合二为一。谢谢!【参考方案3】:

您不必使用循环,但可以在一次错误计算后估算出合适的字体大小,因为大多数字体按比例缩放(尽管字体可能包含不同大小的不同字形)。

例如如果您的绘画区域是 1000px 宽,并且 100pt 字体大小的计算宽度是 1250px,那么 100pt*1000px/1250px = 80pt 的字体大小应该会产生 1000px 的宽度。

【讨论】:

以上是关于Java:如何将绘制的文本动态适应窗口的主要内容,如果未能解决你的问题,请参考以下文章

vc++如何实现屏幕监控画面自适应?

如何在没有窗口的情况下绘制文本

iOS,如何绘制文本的动态长度?

Android:将文本绘制为动态大小的位图

OpenCV-Python实战(番外篇)——OpenCV中利用鼠标事件动态绘制图形

如何在 Chart.js 2.9.3 中绘制具有动态厚度的水平条(在浏览器窗口高度调整大小时自动调整大小)?