我正在尝试创建一个单独的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());
}
}
}
答案 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,而getX
和getY
被称为组件位置,但是当我们调用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)
}
}
就像一个建议使用一些RenderHints
和Graphics2D
看起来很漂亮的文字:)请看这里了解更多信息:
答案 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
确实没有意义。