java - 在 JComponent 上绘制圆圈时 repaint() 的行为

标签 java swing

我有一个作业是关于在单击 JComponent 时在 JComponent 上绘制圆圈,并且如果单击现有圆圈,它将打印一条消息。一切正常,除了我绘制的第一个圆圈将有黑色边框,而后面的圆圈则不会。

我认为这与重绘方法有关,但我似乎无法找到发生了什么。

import javax.swing.*;
import java.awt.*;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.util.ArrayList;

public class GraphComponent extends JComponent {

    private int defaultWidth = 500;
    private int defaultHeight = 500;
    protected Point spot;
    protected int width = 50;
    protected int height = 50;
    private ArrayList<Ellipse2D> shapeList = new ArrayList();

    public GraphComponent() {
        super();
        this.setPreferredSize(new Dimension(defaultWidth,defaultHeight));

        addMouseListener(new MouseAdapter() {
            public void mouseClicked(MouseEvent e) {
                boolean contains = false;
                spot = e.getPoint();
                for (Shape shape : shapeList) {
                    if (shape.contains(spot)) {
                        System.out.println("WIN");
                        System.out.println();
                        contains = true;
                        break;
                    }
                }

                System.out.println();
                System.out.println(shapeList.contains(spot));
                if(contains == false){
                    shapeList.add(new Ellipse2D.Double(spot.x - width / 2,
                            spot.y - width / 2, width, height));
                }
                repaint();
            }
        });

        addMouseMotionListener(new MouseAdapter() {
            public void mouseDragged(MouseEvent e) {
                //moveSquare(e.getX(),e.getY());
            }
        });
    }


    public void paintComponent(Graphics gfx) {
        super.paintComponents(gfx);
        for (Ellipse2D shape : shapeList) {
            gfx.drawOval((int)shape.getX(), (int)shape.getY(),width,height);
            gfx.setColor(Color.YELLOW);
            gfx.fillOval((int)shape.getX(), (int)shape.getY(),width,height);
        }
    }
}

我希望所有的圆圈看起来都一样,但第一个创建的圆圈有黑色边框

circles example

最佳答案

您使用的是唯一的Graphics对象,因此对drawOval的第一次调用(从第一次迭代开始)将使用默认的Graphics进行绘制的颜色,即黑色。

接下来的迭代将全部涂成黄色。

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);
}

关于java - 在 JComponent 上绘制圆圈时 repaint() 的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55456173/

相关文章:

java - JTable动态JCheckBox需要1次点击取消勾选,2次点击勾选

java - java中compareTo()方法比较什么

java - hibernate 与 Tomcat

java - new ClassPathXmlApplicationContext() 创建新的 bean 集

java - BoxLayout can't be shared error while setting it for JPanel 如何解决?

java - 添加 JTextField 后空白 JPanel

java - Swing - 更改 LayoutManager : two components per line

java - 在 Java 中将 StringBuffer 转换为字节数组

java - 激活 Spring 配置文件,以防其他配置文件未激活

java - 无法更改 JOptionPane 的背景颜色