Java 在JComponent上绘制圆时repaint()的行为

Java 在JComponent上绘制圆时repaint()的行为,java,swing,Java,Swing,当我点击JComponent时,我有一个关于在它上画圆圈的作业,如果你点击一个现有的圆圈,它将打印一条消息。一切都很好,除了我画的第一个圆圈会有一个黑色的边框,而下面的圆圈不会 我认为这与重新油漆的方法有关,但我似乎找不到发生了什么 import javax.swing.*; 导入java.awt.*; 导入java.awt.Shape; 导入java.awt.event.MouseAdapter; 导入java.awt.event.MouseEvent; 导入java.awt.geom.Ell

当我点击JComponent时,我有一个关于在它上画圆圈的作业,如果你点击一个现有的圆圈,它将打印一条消息。一切都很好,除了我画的第一个圆圈会有一个黑色的边框,而下面的圆圈不会

我认为这与重新油漆的方法有关,但我似乎找不到发生了什么

import javax.swing.*;
导入java.awt.*;
导入java.awt.Shape;
导入java.awt.event.MouseAdapter;
导入java.awt.event.MouseEvent;
导入java.awt.geom.Ellipse2D;
导入java.util.ArrayList;
公共类GraphComponent扩展了JComponent{
私有int defaultWidth=500;
专用int默认高度=500;
保护点;
保护整数宽度=50;
保护内部高度=50;
私有ArrayList shapeList=新ArrayList();
公共图形组件(){
超级();
此.setPreferredSize(新维度(默认宽度、默认高度));
addMouseListener(新的MouseAdapter(){
公共无效mouseClicked(MouseEvent e){
布尔包含=假;
spot=e.getPoint();
用于(形状:形状列表){
if(形状包含(点)){
System.out.println(“WIN”);
System.out.println();
包含=真;
打破
}
}
System.out.println();
System.out.println(shapeList.contains(spot));
if(contains==false){
shapeList.add(新的椭圆2D.Double(斑点x-宽度/2,
点y——宽度/2,宽度,高度);
}
重新油漆();
}
});
addMouseMotionListener(新的MouseAdapter(){
公共无效鼠标标记(鼠标事件e){
//moveSquare(e.getX(),e.getY());
}
});
}
公共组件(图形gfx){
超级油漆组件(gfx);
对于(椭圆E2D形状:形状列表){
gfx.draw椭圆形((int)shape.getX(),(int)shape.getY(),宽度,高度);
gfx.setColor(Color.YELLOW);
gfx.fillOval((int)shape.getX(),(int)shape.getY(),宽度,高度);
}
}
}
我希望所有的圆圈看起来都一样,但是第一个创建的圆圈有黑色的边框


您使用的是一个独特的
图形
对象,因此对
drawOval
的第一次调用(从第一次迭代开始)将使用默认的
图形
的颜色进行绘制,该颜色为黑色

下一次迭代将全部绘制为黄色

for (Ellipse2D shape : shapeList) {
    gfx.drawOval((int)shape.getX(), (int)shape.getY(),width,height);// BLACK (at first iteration, YELLOW for next ones)
    gfx.setColor(Color.YELLOW);// YELLOW (from now on)
    gfx.fillOval((int)shape.getX(), (int)shape.getY(),width,height);
}

不要调用
super.paintComponents
(带s)!-您应该调用'super.paintComponent(不带s)。如果它不存在,则表示您从错误的类继承。我不知道在哪里使用了
JavaFX
。@realponsign,您的意思是我不应该继承JComponent?super.paintComponents和super.paintComponent有什么区别?不,我是说你应该使用
paintComponent
,因为
paintComponents
是一种完全不同的方法。要了解它们之间的区别,请查看文档。谢谢,就这么简单。