Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java:如何将绘制的文本动态地适配到窗口中_Java_Swing_Text_Metrics_Paint - Fatal编程技术网

Java:如何将绘制的文本动态地适配到窗口中

Java:如何将绘制的文本动态地适配到窗口中,java,swing,text,metrics,paint,Java,Swing,Text,Metrics,Paint,我试图在我的框架/组件上画一个大的“hello world”。 但是我想动态地使它适应窗口大小。因此每次我调整窗口大小时,文本都应该完全适合窗口 我使用FontMetrics类为其指定字体,并测量字符的宽度和高度 但最好有一个方法,我用一个文本传递组件的大小,该方法返回我需要使用的字体。嗯,特定字体的字体大小就足够了 大概是这样的: public int getFontSizeForDrawArea( int width, int height, String text, Font font)

我试图在我的框架/组件上画一个大的“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);
}

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

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

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();

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

你可以计算宽度,用大字体绘制文本,然后用
图形2d.scale
调整文本大小。通常,paintComponent方法接收一个Graphics2D对象,因此您可以将得到的图形对象强制转换为Graphics2D。

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


例如,如果您的绘图区域为1000px宽,而100pt字体大小的计算宽度为1250px,则100pt*1000px/1250px=80pt的字体大小应为1000px宽

好的,当返回的宽度与窗口宽度最接近时,我必须通过一个循环并停止。是的。这个环应该很容易制作。我不知道还有什么其他的方法。为什么两个答案是由同一个人做的而不是编辑原始答案?我把两个答案结合在一起。塔克斯!虽然Java的字体渲染器不是特别好,但是使用不同的大小渲染文本并随后调整其大小可能会导致比使用正确大小渲染字体的图像质量差得多。我理解这样一个问题,即OP希望在所有帧大小下都“完美地”匹配文本。试图找到最适合的文本大小将导致在不断调整窗口大小时出现“大小跳跃”。我想不出别的办法来做这件事。此外,我认为缩小大文本的尺寸比增大小文本的尺寸会带来更好的质量。一个组合的解决方案是找到“有点太大”的文本大小,然后将以该大小绘制的文本缩小一点,但我不知道这看起来是否更好。对于Java 6,启用了“亚像素AA”,以这种方式进行缩放可以完美地渲染。