繁体   English   中英

为什么我的类中的方法仅绘制第一个圆,但是如果我仅在for循环中使用filloval方法,则会显示所有圆?

Why does my method inside a class only draw the first circle but if i just use filloval method inside a for loop it displays all circles?

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在编写一个程序,每次单击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. 您的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示例。

5 我的第一个Perl脚本:在循环中使用“ get($ url)”方法?

因此,这似乎很容易。 使用一系列嵌套循环遍历按年/月/日排序的大量URL,然后下载XML文件。 因为这是我的第一个脚本,所以我从循环开始。 任何语言都熟悉的东西。 我运行它只是打印构造的URL,它运行完美。 然后,我编写了代码以下载内容并分别保存,并且在多个测试用例上使用示例URL时, ...

6 ColdFusion循环仅在第一个循环中显示div

我正在使用ColdFusion循环,并且想知道是否有一种方法可以在循环中包含仅在第一个循环中显示而不在其余任何循环中显示的代码。 我看到的问题可能是,如果只有一个循环仍然应该显示。 是否有一段代码像这样的代码( &lt;cfif Add NEQ session.checkout.quanti ...

7 绘制圆并保留第一个上载的精灵

因此,首先,我将汽车上载到画布上,并赋予其转弯和运动属性。 我试图画一个圆圈与汽车并排,但运行不正常。 这个圆圈是一个人,由于某种原因在闪烁。 我完全删除了超时,圈子和汽车都消失了。 调整超时速率不会消除闪烁。 帮我把它们放在屏幕上,然后将它们放在一起吗? http://jsbin. ...

8 带方法的圆类

我正在创建一个圆类程序,用于检查圆是否相互重叠。 有六种初始给定方法: getter methods for x,y, and radius and setter methods for x,y, and radius (6)。 还有两个额外的给定方法: getArea method (返回区域的值 ...

9 创建使用圆心和半径绘制圆的方法

我创建的方法的作用是可以在pictureBox中创建一个圆,但只能使用矩形的坐标。 我正在尝试创建以下内容, Windows表单具有: 1张照片盒 1个文本框 1个按钮 应该使用textBox插入圆的半径。 我的问题 ...

2012-09-29 15:48:50 1 7418   c#
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM