我正在尝试使用JFrame和JComponent显示一个简单的图像。我已经阅读了一些现有的问题和答案,但没有用。以下是我的JComponent和JFrame子类的代码:
import java.awt.*;
import javax.swing.JComponent;
public class FaceComponent extends JComponent {
public FaceComponent() {
}
public void painComponent(Graphics g) {
g.setColor(Color.WHITE);
g.fillRect(0, 0, getWidth(), getHeight());
g.setColor(Color.YELLOW);
g.fillOval(60, 60, 200, 200);
g.setColor(Color.MAGENTA);
g.fillOval(90, 100, 40, 20);
g.fillOval(180, 100, 40, 20);
g.setColor(Color.PINK);
g.drawLine(120, 160, 140, 180);
g.drawLine(140, 180, 160, 160);
g.drawLine(120, 160, 140, 200);
g.drawLine(140, 200, 160, 160);
g.setColor(Color.BLACK);
g.setFont(new Font("SansSerif", Font.ITALIC, 24));
g.drawString("Whatsup", 30, 200);
}
}
这是我导入JFrame的FaceWindow:
import javax.swing.JFrame;
public class FaceWindow {
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setTitle("lab09ex1");
frame.setSize(400, 300);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setResizable(true);
frame.setVisible(true);
FaceComponent fc = new FaceComponent();
frame.add(fc);
}
}
但最后是一个空的灰色显示屏,而不是我在程序中输入的内容。怎么了?很抱歉在这个问题上并不具体,但这是向您展示我目前情况的唯一方法。
答案 0 :(得分:2)
在FaceComponent
中,painComponent
应为paintComponent
public
,你永远不希望任何人打电话给它。当你试图覆盖一个方法时,你应该总是使用@Override
注释,如果你犯了错误,这会引起编译错误,为你节省大量的时间...... new Font("SansSerif", Font.ITALIC, 24)
方法中使用paint
,因为如果需要加载字体,这可能需要一些时间。最好在构造函数中预加载它并根据需要应用它。FaceComponent
应覆盖getPreferredSize
方法,并应返回"首选"或"默认"大小,这将确保某些布局管理器不会将组件自动调整为0x0
。pack
而不是setSize