我正在编写一个程序,每次单击Jpanel时都会显示一个圆圈。 我已经全部设置好了,我希望能够使用在我的圆类中创建的drawCircle方法在paintComponent方法中绘制圆。 我会将所有创建的圈子存储在链接列表中。 然后,我遍历列表中的每个Circle,并尝试使用我的Circle类中称为drawCircle()的方法。

出于某种原因,如果我尝试在“我的面板”类的for循环中使用c1.drawCircle(),它只会绘制最后一个创建的圆。 但是,如果我只在for循环中使用g.fillOval(具有正确的参数,可以从Circle类中获取值),它将正常工作并显示所有圆圈。 为什么这样做以及如何正确使用Circle类中的方法

我不确定现在要尝试什么。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.LinkedList;

public class MouseTest {
private int borderWidth = 20;
private JFrame frame;
private boolean tracking;
private boolean start;
private boolean clearBol;
private int xstart;
private int ystart;
private int xend;
private int yend;
private LinkedList<Circle> circles;


public MouseTest() {
    tracking = false;
    start = false;
    circles = new LinkedList<Circle>();
    frame = new JFrame();
    frame.setBounds(250, 98, 600, 480);
    frame.setTitle("Window number three");

    Container cp = frame.getContentPane();
    JButton clear = new JButton("Clear");
    JToggleButton circleButton = new JToggleButton()("Circles");
    JToggleButton drawButton = new JToggleButton("Draw");
    ButtonGroup circleOrDraw = new ButtonGroup();
    MyPanel pane = new MyPanel();

    clear.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            clearBol = true;
            frame.repaint();
        }
    });

    JPanel top = new JPanel();
    top.setLayout(new FlowLayout());

    top.add(clear);
    circleOrDraw.add(circleButton);
    circleOrDraw.add(drawButton);
    top.add(circleOrDraw);
    cp.add(top, BorderLayout.NORTH);


    cp.add(pane, BorderLayout.CENTER);

    pane.addMouseListener(new MouseAdapter() {
        public void mousePressed(MouseEvent e) {
            xstart = e.getX();
            ystart = e.getY();
            start = false;


        }

        public void mouseReleased(MouseEvent e) {
            xend = e.getX();
            yend = e.getY();

            if (xend < xstart) {
                int tmp = xstart;

                xstart = xend;
                xend = tmp;
            }

            if (yend < ystart) {
                int tmp = ystart;

                ystart = yend;
                yend = tmp;
            }
            start = true;
            frame.repaint();
        }
    });
    pane.addMouseMotionListener(new MouseMotionAdapter() {
        public void mouseMoved(MouseEvent e) {
            if (tracking) {
                int x = e.getX();
                int y = e.getY();

                msg("(" + x + ", " + y + ")");
            }
        }
    });
    frame.setVisible(true);
}    // constructor

public static void main(String[] arg) {
    MouseTest first = new MouseTest();
}    // main

public void msg(String s) {
    System.out.println(s);
}

public void trackMouse() {
    tracking = !tracking;
}    // trackMouse

public class Circle extends JPanel {
    Graphics g;
    int x;
    int y;
    int r;
    Color color;

    public Circle(Graphics g, int x, int y, int r) {
        this.g = g;
        this.x = x;
        this.y = y;
        this.r = r;
        int red = (int) (256 * Math.random());
        int green = (int) (256 * Math.random());
        int blue = (int) (256 * Math.random());
        this.color = new Color(red, green, blue);
    }

    public void drawCircle() {
        int x2 = x - (r / 2);
        int y2 = y - (this.r / 2);

        g.setColor(color);
        g.fillOval(x2, y2, this.r, this.r);


    }


    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }

    public Color getColor() {
        return color;
    }

    public int getR() {
        return r;
    }


}

public class MyPanel extends JPanel {
    public void paintComponent(Graphics g) {


        if (start) {

            circles.add(new Circle(g, xend, yend,
                    (int) ((250 * Math.random() + 4))));

            //Area where I'm having issues
            for (Circle c1 : circles) {
                msg("" + c1.getX());
// this method that I created in the circle class will only draw the first circle

                //c1.drawCircle();  
                int r = c1.getR();
                int x = c1.getX();
                int y = c1.getY();

                g.setColor(c1.getColor());
                g.fillOval((c1.getX() - (r / 2)), (c1.getY() - (r / 2)),
                        r, r); // this will display all the circles
            }
            int size = circles.size();
            msg(size + " Size");


            msg("" + circles.getLast().getX());


        }
        if (clearBol) {
            super.paintComponent(g);
            circles.clear();
            clearBol= false;


        }

谢谢!

#1楼 票数:1 已采纳

您课程的大部分结构都需要更改

  1. 您的MyPanel应该有一个更好的名称来提供其功能,也许是诸如DrawingPanel东西。

  2. 然后, DrawingPanel负责管理要绘制的圆。 因此,通常您只需要使用ArrayList来保存Circle信息。

  3. 然后,您将向类添加一个方法,例如addCircle(...)以将Circle信息添加到ArrayList中,然后调用repaint()。

  4. 然后,在paintComponent(...)方法中,您要做的第一件事是调用super.paintComponent(...)以清除面板。 然后,您遍历ArrayList并绘制所有Circle。 不需要布尔值来检查类的状态。 ArrayList将带有圆圈或没有圆圈。

  5. 您还需要像clearCircles()这样的方法。 这将简单地从ArrayList中删除所有Circle,并对其自身调用repaint()。

  6. 您的Circle类不应扩展JPanel。 它应该只是一个包含绘制圆形所需信息的类:x / y位置,圆形大小和圆形颜色。

  7. 现在,您的框架负责显示您的DrawingPanel和按钮。

  8. 单击“清除”按钮时,只需调用DrawingPanelclearCircles()方法。

  9. 对于您的MouseListener,您一旦拥有创建Circle实例所需的所有信息,只需调用DrawingPaneladdCircle(...)方法。

有关包含所有这些建议的完整工作示例,请查看“ 自定义绘画方法”中DrawOnComponent示例。

  ask by Christian Mechem translate from so

未解决问题?本站智能推荐:

2回复

如何在Java中绘制一个实心圆?

我有一个带网格布局的JPanel。 在网格的“单元格”中,我可以放置不同的元素(例如JButtons)。 没有问题。 但现在我想在一些细胞中放一个圆圈。 我还想将ActionListener与这些圈子联系起来。 更详细地说,如果我单击圆圈,它将从当前单元格中消失并显示在另一个圆圈中。
1回复

绘制在Java GUI中作为实例创建的圆

因此,我已经在这个问题上停留了一段时间了,我非常渴望获得帮助。 请帮我。 我有3节课: 圆只是假设在由Frame创建的具有随机起始位置的框架中绘制一个圆(并确定半径)。 框架是主要类,具有诸如addCircle(),bounce(),start(),stop(),run()(移动
1回复

绘制方法在另一个类中的形状

我需要为游戏创建一个 GUI,我需要在屏幕上显示武器和盾牌。 我需要修改程序,使其显示武器和盾牌,但它们的属性在另一个类中。 我知道我将不得不扩展 JPanel 类并覆盖其paintComponent() 方法。 这是我的主要方法: 我如何调用这些方法? 我需要做什么才能让它们出现在我的框架
1回复

让一个圆绕另一个圆运行

我一直在做大量的研究,但我发现的问题都没有真正回答我的问题,这就是我发表这篇文章的原因。 我想创建一个程序,它将有一个圆,一个围绕另一个圆的“行星”轨道,一个“太阳”。 我设置了静态 gui,但我在书中或网上发现的任何内容都无法真正帮助解决轨道问题。 有任何想法吗? 注意:最终该程序需要是多线
1回复

使用java swing从另一个类调用方法以在当前类上绘制

我目前正在从事Hangman游戏。 游戏使用驱动程序,并输入单词的文本文件,选择一个随机单词,并将其发送到我的ImageBuilder类,该类创建带有文本框和按钮的gui,以提交字母并玩游戏。 如果用户输入了错误的字母,它将对我的DrawArea类进行方法调用,该类将布尔值更改为true
3回复

仅在循环中创建的最后一个JLabel上检测到MouseListeners

我遇到了将MouseListeners添加到循环内创建的一组Jlabels的问题。 当用户将鼠标悬停在标签上时,我正在创建的程序需要更改JLabel的图标。 我创建了一个for循环来初始化一个全局声明的标签,设置一个边框,添加一个鼠标监听器并将标签添加到面板。 然后我的老鼠听众
1回复

当我在循环中触发应用程序(对同步但不同步)感兴趣时,自动调用绘制方法(Java)

我正在开发某种视频游戏,所以我对从keylistening进行每次更新时调用paint,repaint或任何类型的方法都不感兴趣,因为它们还调用了更新(Graphics g)方法来清理整个屏幕。 这就是为什么我想要@Override更新方法,而不是让它首先清理屏幕。 这样做我可以根据需要更新
1回复

将圆画到JFrame

我在将一些圈子吸引到我的JFrame时遇到问题。 我最初使用默认布局,并意识到这只是添加了最新的圆圈,所以我将布局更改为null,现在什么也没画。 我也尝试过frame.setLayout(new FlowLayout()) ,它也不会画任何东西。 任何帮助,将不胜感激!