首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将下标和字体添加到JFrame上的图形字符串中

将下标和字体添加到JFrame上的图形字符串中
EN

Stack Overflow用户
提问于 2017-06-26 17:02:47
回答 2查看 778关注 0票数 2

我想在我的JFrame上画一个具有下标和字体的字符串,我试图使用AttributedString,但是我似乎不想因为任何原因而工作。它要么只显示字体,要么只显示下标,但不是同时显示。

代码语言:javascript
运行
复制
private class DrawFormulas extends JComponent
{
    public void paint(Graphics g)
    {

        Graphics2D G2D = (Graphics2D)g;

        G2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

        g.setFont(F);

        AttributedString Trig = new AttributedString("a2 + b2 = c2");
        Trig.addAttribute(TextAttribute.FONT, F);
        Trig.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, 1, 2);
        Trig.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, 6, 7);
        Trig.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, 11, 12);
        Trig.addAttribute(TextAttribute.SIZE, F.getSize());
        G2D.drawString(Trig.getIterator(), 170, 75);

    }
}

如果有人能告诉我为什么这不起作用,或者有更好的方法来做这件事,任何帮助都会受到感谢。谢谢

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-06-26 18:11:07

我不知道为什么在使用TextAttribute.FONTTextAttribute.SUPERSCRIPT时不合并这些属性,但是@ 回答给出了解决方案的想法。

Font对象分离为:

  • 字体大小= 60
  • 字体族= Font.SANS_SERIF
  • 字体样式= Font.PLAIN

由于样式很简单,我们只需要字体大小和字体系列,所以我以这样的方式结束:

代码语言:javascript
运行
复制
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.font.TextAttribute;
import java.text.AttributedString;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;

public class FormulaDrawer {
    private JFrame frame;

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new FormulaDrawer()::createAndShowGui);
    }

    private void createAndShowGui() {
        frame = new JFrame(getClass().getSimpleName());

        Drawer drawer = new Drawer();

        frame.add(drawer);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
    }

    @SuppressWarnings("serial")
    class Drawer extends JPanel {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);

            Graphics2D g2d = (Graphics2D) g;
            g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

            AttributedString trig = new AttributedString("a2 + b2 = c2");
            trig.addAttribute(TextAttribute.FAMILY, "Comic Sans MS"); //Change to Font.SANS_SERIF constant
            trig.addAttribute(TextAttribute.SIZE, 20);

            trig.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, 1, 2);
            trig.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, 6, 7);
            trig.addAttribute(TextAttribute.SUPERSCRIPT, TextAttribute.SUPERSCRIPT_SUPER, 11, 12);

            g2d.drawString(trig.getIterator(), 50, 50);
        }

        @Override
        public Dimension getPreferredSize() {
            return new Dimension(200, 200);
        }
    }
}

然而,您可能已经注意到,我使用的字体大小为20而不是60,这是因为它对我来说太大了,只需更改它,您就完成了,而且我使用了另一种字体,所以您可以看到您可以使用任意字体(请确保安装了该字体或导出到您的JAR文件中)

一般的想法是单独使用字体属性,如上面代码中所示,如下所示:

代码语言:javascript
运行
复制
trig.addAttribute(TextAttribute.FAMILY, "Comic Sans MS");
trig.addAttribute(TextAttribute.SIZE, 20);

如下所示:)

另外,一定要遵循Java命名约定,这样您和我们的代码就更容易阅读了:

  • firstWordLowerCaseVariable
  • firstWordLowerCaseMethod(...)
  • FirstWordUpperCaseClass
  • ALL_WORDS_UPPER_CASE_CONSTANT

代码的另一个改进是:不要分别扩展和重写JComponentpaint()方法,而是扩展JPanel或任何其他组件,重写它的paintComponent(Graphics g)方法,并确保调用super.paintComponent(g)作为其中的第一行,这样就不会中断油漆链。

我的main(...)方法在您看来可能也很奇怪,因为Java8中的方法参考事件调度线程(EDT),您应该总是在那里使用来启动Swing程序。

有什么方法可以用字体的样式来做吗?

是的,有(就像链接中所示的“鞭打神的答案”)

您可以找到更多阅读TextAttribute文档的样式。

例如:

代码语言:javascript
运行
复制
trig.addAttribute(TextAttribute.WEIGHT, TextAttribute.WEIGHT_BOLD);
trig.addAttribute(TextAttribute.POSTURE, TextAttribute.POSTURE_OBLIQUE);
票数 3
EN

Stack Overflow用户

发布于 2019-11-10 09:16:14

如果有人能告诉我为什么这不起作用 我不知道为什么在使用TextAttribute.FONT和TextAttribute.SUPERSCRIPT时不合并这些属性

这是因为字体TextAttribute是以一种特殊的方式处理的。来自javadoc:

..。通常,所有属性都会被检查并用于选择和配置字体实例。但是,如果存在字体属性,则将使用与其关联的字体。..。通常,除字体属性外,Map中不会有其他属性。

Javadoc还解释说,其他属性可以与字体属性一起使用,但不能使用以下属性:家庭、体重、宽度、姿势、大小、转换、上标和跟踪。

这就是为什么上标属性被忽略的原因。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44764890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档