Java 为什么不能画椭圆?

Java 为什么不能画椭圆?,java,swing,graphics,graphics2d,Java,Swing,Graphics,Graphics2d,我试图理解绘画图形,但我的椭圆无法绘制。有人能告诉我我做错了什么,椭圆没有画画吗? 我在哪里犯了错误 主要类别: import java.awt.EventQueue; public class Main { public static void main(String[] args) { EventQueue.invokeLater(new Runnable() { @Override public void run() { Fr

我试图理解绘画图形,但我的椭圆无法绘制。有人能告诉我我做错了什么,椭圆没有画画吗? 我在哪里犯了错误

主要类别:

import java.awt.EventQueue;
public class Main {
public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            Frame frame = new Frame();

        }
    });
}
框架类别:

public class Frame extends JFrame {
private static final long serialVersionUID = 1L;

public static Grafika grafika;

public Frame() {
    JFrame frame = new JFrame("Title");
    grafika = new Grafika();

    frame.setSize(500, 500);
    frame.setLocationRelativeTo(null);
    frame.setDefaultCloseOperation(EXIT_ON_CLOSE);
    frame.setVisible(true);
    frame.setLayout(null);
    // frame.addKeyListener(this);
    frame.add(grafika);
}
}
最后一节课:

public class Grafika extends JComponent {

int x = 200;
int y = 200;

public void paint(Graphics g) {

    Graphics2D oval = (Graphics2D) g;
    oval.setColor(Color.BLACK);
    oval.fillOval(x, y, 100, 100);
    oval.setRenderingHint(RenderingHints.KEY_ANTIALIASING, 
    RenderingHints.VALUE_ANTIALIAS_ON);

}
}

有几个问题,但最大的问题是在JFrame上使用空布局,然后添加一个JComponent,其首选大小和大小均为0,0。因此,当您将Grafika添加到JFrame时,它没有被显示的机会

建议:

除非在非常特殊的情况下,否则不要使用空布局。 为Grafika组件提供一个首选大小,最好覆盖getPreferredSize,但在这个阶段,我认为调用setPreferredSize是可以的。。。在上面。 将其添加到JFrame,打包JFrame,最后,只有在所有组件都添加到JFrame之后,才能使其可见。 也

您应该覆盖paintComponent而不是paint 您应该在覆盖中调用超级绘制方法。 当您认为您正在重写父方法时,请始终使用@Override注释。你可能错了,你想让编译器告诉你。 在绘制之前设置渲染提示。否则,提示将不会对图形产生影响。 避免给出与核心Java类(如Frame)名称冲突的类名称。这可能会混淆别人和你未来的自我。 e、 g

因为您使用的是Swing,所以应该重写paintComponent而不是paint,所以还应该注意使用null布局。但关键是,您应该在使框架可见之前添加Grafika组件:

frame.add(grafika);
frame.setVisible(true);
//    frame.setLayout(null); REMOVE THIS!
如果确实需要在框架可见后添加组件,则应在框架或包含已添加组件的面板上调用revalidate+repaint:

frame.setVisible(true);
//    frame.setLayout(null); REMOVE THIS!
frame.add(grafika);
frame.validate();
frame.repaint();

如果框架类扩展了JFrame,为什么要在框架构造函数中创建新的JFrame?你已经是一个JFrame了。
frame.setVisible(true);
//    frame.setLayout(null); REMOVE THIS!
frame.add(grafika);
frame.validate();
frame.repaint();