当前位置: 首页 > 面试题库 >

如何使用图形在多行上输出字符串

督宏旷
2023-03-14
问题内容

我的程序将覆盖public void paint(Graphics g, int x, int y);以使用g.drawString(someString, x+10, y+30);

现在someString可能会很长,因此可能不适合一行。

在多行上编写文本的最佳方法是什么。
例如,在矩形(x1,y1,x2,y2)中?


问题答案:

感谢Epaga的提示和网上的一些示例(查找起来并不那么明显!我主要使用Break
Line作为文本布局
),我可以制作一个组件来显示包装的文本。它是不完整的,但至少可以显示预期的效果。

class TextContainer extends JPanel
{
    private int m_width;
    private int m_height;
    private String m_text;
    private AttributedCharacterIterator m_iterator;
    private int m_start;
    private int m_end;

    public TextContainer(String text, int width, int height)
    {
        m_text = text;
        m_width = width;
        m_height = height;

        AttributedString styledText = new AttributedString(text);
        m_iterator = styledText.getIterator();
        m_start = m_iterator.getBeginIndex();
        m_end = m_iterator.getEndIndex();
    }

    public String getText()
    {
        return m_text;
    }

    public Dimension getPreferredSize()
    {
        return new Dimension(m_width, m_height);
    }

    public void paint(Graphics g)
    {
        super.paintComponent(g);

        Graphics2D g2 = (Graphics2D) g;
        FontRenderContext frc = g2.getFontRenderContext();

        LineBreakMeasurer measurer = new LineBreakMeasurer(m_iterator, frc);
        measurer.setPosition(m_start);

        float x = 0, y = 0;
        while (measurer.getPosition() < m_end)
        {
            TextLayout layout = measurer.nextLayout(m_width);

            y += layout.getAscent();
            float dx = layout.isLeftToRight() ?
                    0 : m_width - layout.getAdvance();

            layout.draw(g2, x + dx, y);
            y += layout.getDescent() + layout.getLeading();
        }
    }
}

只是为了好玩,我使它适合一个圆圈(看起来很不合理):

public void paint(Graphics g)
{
    super.paintComponent(g);

    Graphics2D g2 = (Graphics2D) g;
    FontRenderContext frc = g2.getFontRenderContext();

    LineBreakMeasurer measurer = new LineBreakMeasurer(m_iterator, frc);
    measurer.setPosition(m_start);

    float y = 0;
    while (measurer.getPosition() < m_end)
    {
        double ix = Math.sqrt((m_width / 2 - y) * y);
        float x = m_width / 2.0F - (float) ix;
        int width = (int) ix * 2;

        TextLayout layout = measurer.nextLayout(width);

        y += layout.getAscent();
        float dx = layout.isLeftToRight() ?
                0 : width - layout.getAdvance();

        layout.draw(g2, x + dx, y);
        y += layout.getDescent() + layout.getLeading();
    }
}

我对dx计算不太确定。



 类似资料:
  • 我正在使用xslt转换xml文档。我需要使用输出转义来获得我的结果,因为我使用的工作服务器只会输出

  • 我使用JSCH-SSH库在“shell”通道中执行命令,但无法找到一种方法来做两件事:- 1)如何查找命令是否在远程unix box上完全执行? 2)如何在String中捕获命令输出,而不是在System.out控制台上打印? 下面是我的代码片段,它可以很好地在系统上显示shell命令输出。出来 注意:我不想使用“exec”通道,因为它为每个命令启动一个新进程,并且不记得导出的“session”变

  • 嗨,我的代码有一些问题,我需要接受一个3行的输入,并计算输入中“$”的数量。输入方法未注释为“scanf(”%[]s“,&userinput);”是唯一一个我发现采取所有3行输入,但我不能打破输入循环继续我的程序。 任何帮助都将不胜感激

  • 所以我创建了这段代码,它接收一个列表并根据它们是否满足这些标准返回True或False。这是我的密码 现在我想添加一个新的转折点,即如果列表中的任何字母、数字、字符在一行中出现3次,结果将返回False。。这是我的尝试。。。 然而,这显然根本不起作用...我在这里做错了什么??我的代码应该是为了我的输出是正确的??

  • 问题内容: 我想知道如何使用f字符串以Pythonic方式格式化这种情况: 问题是不能在f字符串的表达式部分内使用。预期产量: 问题答案: 你不能 反斜杠不能出现在花括号内;这样做会导致: 这是在PEP中为f字符串指定的: 反斜线可能不会出现在f字符串的表达式部分内,[…] 一种选择是先命名,然后再在-string内进行命名;也就是说,不使用文字: 结果是: @wim指定的另一个选项是用来获取返回

  • 问题内容: 是否有内置方式或合理的标准软件包,可让您将标准UUID转换为短字符串,从而启用较短的URL? 即利用了较大范围的字符,例如输出较短的字符串。 我知道我们可以使用base64对字节进行编码,如下所示,但是我正在创建一个看起来像“单词”的字符串,即no 和: 问题答案: 甲通用唯一标识符(UUID)是一个128位的值,它是16个字节。对于人类可读的显示,许多系统使用规范格式,该规范格式使用