Java (AWT) : fitting text in a box

标签 java fonts awt

我有一个扩展框架的应用程序。然后,它会显示几行文本:

Font f = new Font("Arial", Font.PLAIN, 10);
g.setFont(f);
g.drawString("Test|great Yes ^.", x, y + 10);

现在发生的是文本不适合周围的框。例如。我希望文本适合 [x,y]-[x+width, y+10](不关心宽度)但它略低于 y+10 线。现在对于大多数字符(“T”、“e”等)来说,这适合但“|”而'g'不要!它们低于 y+10 线。看来你不能使用:在 y + characterHeight 处绘制。但是什么有效?

为了明白我的意思,这里有一些示例代码:

import java.awt.*;

public class test extends Frame
{
        public test()
        {
                /* retrieve max window size */
                GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
                GraphicsDevice[] gs = ge.getScreenDevices();
                GraphicsConfiguration [] gc = gs[0].getConfigurations();
                Rectangle r = gc[0].getBounds();
                setSize(r.width, r.height);
                setVisible(true);
        }

        public void paint(Graphics g)
        {
                final int windowWidth  = getSize().width;
                final int windowHeight = getSize().height;
                g.setColor(Color.BLUE);
                g.fillRect(0, 0, windowWidth, windowHeight);
                g.setColor(Color.WHITE);
                g.fillRect(0, 100, windowWidth, 110);
                int textHeight = 100;
                Font f = new Font("Arial", Font.PLAIN, textHeight);
                g.setFont(f);
                g.setColor(Color.BLACK);
                g.drawString("Test|great Yes ^.", 10, 100 + textHeight);
        }

        public void guiLoop()
        {
                for(;;) { try { Thread.sleep(1000); } catch(Exception e) { } }
        }

        public static void main(String [] args)
        {
                new test().guiLoop();
        }
}

我也试过下面的代码:

public void paint(Graphics g)
{
        final int windowWidth  = getSize().width;
        final int windowHeight = getSize().height;
        g.setColor(Color.BLUE);
        g.fillRect(0, 0, windowWidth, windowHeight);
        g.setColor(Color.WHITE);
        g.fillRect(0, 100, windowWidth, 110);
        int textHeight = 100;

        String str = "Test|great Yes ^.";
        Font f = new Font("Arial", Font.PLAIN, textHeight);
        Rectangle2D boundingRectangle = f.getStringBounds(str, 0, str.length(), new FontRenderContext(null, false, false));
        f = f.deriveFont((float)(textHeight * (textHeight / boundingRectangle.getHeight())));
        boundingRectangle = f.getStringBounds(str, 0, str.length(), new FontRenderContext(null, false, false));
        g.drawString(str, 10, 100 + (int)boundingRectangle.getHeight());

        g.setFont(f);
        g.setColor(Color.BLACK);
        g.drawString(str, 10, 100 + textHeight);
}

这样稍微好一些:文本较小,因此可能适合,但仍然存在 y 位置不正确的问题。

感谢所有帮助!

最佳答案

使用 FontMetrics 怎么样?您可以使用 g.getFontMetrics()Graphics 对象中获取它。

比您可以检索最大下降或上升或直接高度(使用 getHeight),因此您的实现将是字体独立的,它应该工作正常.. 查看文档 here !

编辑(解释评论): 没有直接的方法告诉字符串以适合盒子的方式绘制自己。你必须自己做..比如从最大字体大小开始并检查宽度是否适合框,否则减小大小并重试。对于高度,您应该首先决定(或获得)最大字体高度,然后您可以设置框的像素数。

关于Java (AWT) : fitting text in a box,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1779708/

相关文章:

fonts - Webdings 字体在大多数平台上都可用吗?

java - Java小程序中keyListener的使用方法

java - 在卡片布局中定位组件

java - java中如何设置多维数组的初值

java - Tomcat Web 应用程序更改部署目录

JAVA:使用 ColorModel 将一种颜色替换为另一种颜色

java - 我的 Java 代码出了什么问题?

java - HTTP ://a href link not working in Android

php - 动态 GD 图像宽度文本

ios - 快速为整个 iOS 应用程序使用自定义字体