JFrame显示错误

时间:2014-08-21 05:50:21

标签: java swing jframe jcomponent

我正在尝试使用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);
}
}

但最后是一个空的灰色显示屏,而不是我在程序中输入的内容。怎么了?很抱歉在这个问题上并不具体,但这是向您展示我目前情况的唯一方法。

1 个答案:

答案 0 :(得分:2)

FaceComponent中,painComponent应为paintComponent

  • 这种方法不需要public,你永远不希望任何人打电话给它。当你试图覆盖一个方法时,你应该总是使用@Override注释,如果你犯了错误,这会引起编译错误,为你节省大量的时间......
  • 不建议在new Font("SansSerif", Font.ITALIC, 24)方法中使用paint,因为如果需要加载字体,这可能需要一些时间。最好在构造函数中预加载它并根据需要应用它。
  • FaceComponent应覆盖getPreferredSize方法,并应返回"首选"或"默认"大小,这将确保某些布局管理器不会将组件自动调整为0x0
  • 考虑使用pack而不是setSize
  • 确保在将组件显示之前始终将组件添加到框架中,这也将解决在框架首次可见时未显示组件的问题
  • 您应该始终确保在事件调度线程的上下文中创建和修改UI,有关详细信息,请参阅Initial Threads