【问题标题】:Changing the colour of text in drawstring()更改 drawstring() 中文本的颜色
【发布时间】:2012-11-27 22:02:06
【问题描述】:

我正在尝试在使用 swing 绘制的字符串中强调一项工作。

有人建议我使用带有以下代码的 HTML:

Graphics2D g2 = (Graphics2D) g;
g.drawString("this is something I want people to <p color="#00FF00">NOTICE</p>", x, y);

我试过了,但没有运气......它只是输出 HTML

谁能指出我正确的方向?

【问题讨论】:

  • 你需要转义你的引号

标签: java swing awt java-2d styledtext


【解决方案1】:

如果您只是创建一个强调单词的简单标签,您可以像这样将 HTML 直接分配到 JLabel...

JLabel label = new JLabel("<html>this is something I want people to <p color='#00FF00'>NOTICE</p>");

只要您在 JLabel 的字符串开头有 &lt;html&gt; 片段,它就会使用 HTML 渲染器来绘制它。

不过,正如@AndrewThompson 所指出的,&lt;p&gt; 会强制将彩色文本换行,因此&lt;span&gt; 可能更合适...

JLabel label = new JLabel("<html>this is something I want people to <span style='color:#00FF00;'>NOTICE</span>");

【讨论】:

  • 出色的编辑。我只是注意到那个字符串有多奇怪。它读起来像一个句子,但 HTML 将最后一个单词变成了一个新段落。
  • 这当然很有趣@AndrewThompson,人类可以简单理解的东西,可以通过依赖特定语法的计算机进行非常不同的解释。
  • @AndrewThompson 请参阅我更新的答案,了解为什么 NOTICE 独占一行
  • 我刚刚将“良好的编辑”升级为“出色的编辑”。使用span 更有意义。
【解决方案2】:

使用Graphics.setColor() 更改您所做的任何事情的颜色。或者使用JLabel 设置颜色。

【讨论】:

    【解决方案3】:

    对样式文本使用JLabel。请参阅LabelRenderTest,了解如何将其绘制到图像上并用于绘画。

    使用Graphics/AWT 方法

    字符串暗示NOTICE 应该是绿色,但其余默认(黑色)。我们需要使用字符串两部分的颜色调用drawString(String) 两次,将后一个字符串偏移第一个字符串的宽度。要获得宽度,请参阅 FontMetricsGlyphVector 之类的内容。 This answer 使用 GlyphVector 来获取字母的轮廓。

    【讨论】:

    • 您好,谢谢您……更改 1 个单词的颜色看起来有点复杂。这是唯一的方法还是有更简单的选择(我才刚开始玩摇摆)
    • 嗨 Andrew,我正在从 println() 迁移到 GUI,发现转换有点困难。当我想有一个更简单的选项时,我想知道是否有一些不那么复杂的东西,因为我不知道你发给我的大量代码列表中发生了什么。您的“雇用某人”评论不仅没有建设性,而且对于努力学习新技能的人来说也很不妥。
    • 查看编辑。我还建议在 GUI 中尝试更简单的东西。自定义绘画(尤其是字符串)是一个高级主题。
    • @DavidKroukamp 它可以在不使用样式化文本组件的情况下完成(请参阅“AWT 编辑”),但这会带来很多麻烦。我更喜欢利用 Swing 的渲染能力来绘制样式文本。
    【解决方案4】:
    • 这是如何编译的:g.drawString("this is something I want people to &lt;p color="#00FF00"&gt;NOTICE&lt;/p&gt;", x, y); 因为 ' " ' 是一个特殊字符,我们必须使用 \

    • 对其进行转义
    • 您投射到 Graphics2D 但不使用它(与问题无关,但可能导致异常)。

    应该是:

    Graphics2D g2 = (Graphics2D) g;
    g2.drawString("this is something I want people to <p color=\"#00FF00\">NOTICE</p>", x, y);
    

    要添加颜色,只需在 Graphics 对象上调用 setColor(Color c)

    g2.setColor(Color.GREEN);
    

    但是,这会将整个字符串设置为绿色,如果您只想将部分绘制为绿色,请使用JLabel 以获得 HTML 支持(最高 HTML3.2):

    JLabel label = new JLabel("<html>this is something I want people to <p color=\"#00FF00\">NOTICE</p></html>");
    

    完整示例:

    NB 正如你所看到的,通知在它自己的行上,这是因为 paragraph 标签而不是使用 font 标签来获取它像这样的单行:

    import java.awt.EventQueue;
    import javax.swing.JFrame;
    import javax.swing.JLabel;
    
    public class Test {
    
        public Test() {
            JFrame frame = new JFrame();
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            JLabel label = new JLabel("<html>this is something I want people to <p color=\"#00FF00\">NOTICE</p></html>");
    
            // JLabel label = new JLabel("<html>this is something I want people to <font color=\"#00FF00\">NOTICE</font></html>");//will be shown on single line
    
            frame.add(label);
    
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            EventQueue.invokeLater(new Runnable() {
                @Override
                public void run() {
                    new Test();
                }
            });
        }
    }
    

    【讨论】:

    • 对转义字符的调用也很好。
    【解决方案5】:

    您可以在 g.drawString() 之前使用 g.setColor(Color.BLUE)。 (例如 Color.BLUE)

    【讨论】:

    • 字符串暗示 NOTICE 应该是绿色的,但其余的 ..default。我们需要用两种颜色调用drawString 两次,将后一个字符串偏移第一个的宽度。
    • 你是对的。据我所知,您只有解决问题的方法。
    • 它反转原始图像的颜色并将文本添加为​​黑色。是否需要进行其他设置才能使用它?
    【解决方案6】:

    你可以添加 g.setColor(Color.Chosen Color);然后用 g.drawString() 写出字符串 也许

    【讨论】:

    • 对至少一个较早的答案没有什么新鲜的,有没有:-)
    猜你喜欢
    • 2018-05-03
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 2017-03-14
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    相关资源
    最近更新 更多