5

我正在尝试创建一个单独的CustomFont类,在其中我可以使用不同的文本属性。所以我创建了一个新的扩展类Font,并在里面创建了一个私有类绘图扩展JComponent。我在方法中更改字体和文本的颜色和其他特性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());
        }
    }
}
4

2 回答 2

3

添加到我的评论:

super.XXX1)您不通过调用您应该调用的方法实现来尊重绘制链,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()andgetY()已经被 0,0, As 替换getXgetY组件位置,但是当我们调用时,drawString我们为它提供了在容器内绘制位置的参数(当然它必须在边界/大小 f 容器内。

getPreferredSize2)您应该在绘制到图形对象时覆盖并返回Dimension适合您的组件图纸/内容的 s,否则在视觉上不会有任何可见的东西,因为组件大小将为 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)
    }
}

RenderHints并且只是作为一个建议使用一些Graphics2D好看的文本:) 更多信息请参见这里:

于 2013-01-06T20:24:42.753 回答
1

CustomFont门课有很多东西没有任何意义。一方面,实际上与字体没有任何关系,另一方面,你并没有真正使用任何编码在其中的东西。以下内容似乎更符合您正在寻找的内容。

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);
    }
}

绘图使用 a Font,字体不使用 a DrawingDrawingFont. _

于 2013-01-05T17:50:59.687 回答