在Java中更改文本的颜色

时间:2013-01-05 17:38:54

标签: java swing colors jlabel

我正在尝试创建一个单独的CustomFont类,其中我可以使用不同的文本属性。所以我创建了一个新的扩展Font类,并在里面创建了一个扩展JComponent的私有类Drawing。我在paintComponent方法中更改了字体和文本的颜色和其他特征。

问题是paintComponent方法没有被调用。我确信我犯了一些错误。

以下是代码:

import javax.swing.JComponent;

public class CustomFont extends Font {
    private String string;
    private int FontStyle;

    public CustomFont(String text, int style) {
        super("Serif", style, 15);
        FontStyle = style;
        string = text;  

        Drawing draw = new Drawing();
        draw.repaint();
    }

    private class Drawing extends JComponent {
        public void paintComponent(Graphics g) {
            Font font = new Font("Serif", Font.BOLD, 15);
            g.setFont(font);
            g.setColor(Color.YELLOW);
            g.drawString(string, getX(), getY());
        }
    }
}

2 个答案:

答案 0 :(得分:3)

添加到我的评论中:

1)你不应该通过调用super.XXX实现paintComponent(..)方法来尊重油漆链,它应该是被覆盖方法中的第一个调用,否则可能会发生异常:

@Override 
protected void paintComponent(Graphics g) {
      super.paintComponent(g);

      Font font = new Font("Serif", Font.BOLD, 15);
      g.setFont(font);
      g.setColor(Color.YELLOW);
      g.drawString(string, 0, 0);
}

在上面的代码中注意@Override注释,所以我确信我会覆盖正确的方法。此外,getX()getY()已被替换为0,0,而getXgetY被称为组件位置,但是当我们调用drawString时,我们提供它在容器内绘制的地方的参数(当然它必须在边界/大小f容器内。

2)绘制到图形对象时,应该覆盖getPreferredSize并返回适合您的组件图形/内容的Dimension,否则在视觉上不会有任何可见的组件大小为0,0:

private class Drawing extends JComponent {

    @Override
    public Dimension getPreferredSize() {
        return new Dimension(200, 200);//you would infact caluclate text size using FontMetrics#getStringWidth(String s)
    }
}

就像一个建议使用一些RenderHintsGraphics2D看起来很漂亮的文字:)请看这里了解更多信息:

答案 1 :(得分:1)

这个CustomFont课程中有很多内容并没有任何意义。首先,缺少任何与Font实际相关的事情,另一个事实是你并没有真正使用其中的任何代码。以下似乎更符合您的要求。

public class Drawing extends JComponent {
    String text;
    Font myFont;
    Color myTextColor;

    public Drawing(String textArg, Font f, Color textColor) {
        myFont = f;
        myTextColor = textColor;
        text = textArg;
    }

    public void paintComponent(Graphics g) {
        g.setFont(myFont);
        g.setColor(myTextColor);
        g.drawString(text, 0, getHeight() / 2);
    }
}

如下图所示......

public class Test {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Font font = new Font("Serif", Font.BOLD, 15);
        String text = "blah blah blah";
        Color textColor = Color.YELLOW;
        Drawing d = new Drawing(text, font, textColor);

        frame.add(d);
        frame.setSize(100,100);
        frame.setVisible(true);
    }
}

绘图使用Font,Font不使用Drawing。在Drawing内定义Font确实没有意义。