【问题标题】:Adding a Circle Object to An Arraylist and displaying on Screen将圆形对象添加到 Arraylist 并在屏幕上显示
【发布时间】:2012-03-09 19:19:11
【问题描述】:

这是我学习 Java 的第二个学期,所以请耐心等待。我的部分任务是单击单选按钮并使用 Circle 的 draw 方法在单击鼠标按钮时在 Jpanel 内容窗格上绘制一个 Circle 对象。然后将每个 Circle 对象存储在 Arraylist 中,这样它就会一直停留在窗格中,直到我取消单击单选按钮。除了将 Circle 对象添加到 Arraylist 并将该圆圈保留在屏幕上之外,我可以让一切正常工作。当我再次单击时,它只会一次画一个圆圈并擦除第一个圆圈。我不认为我正在将创建的新圈子添加到 Arraylist,我只是一个圈子。不确定。

这是我绘制圆圈部分的代码。

public class MyPanel extends JPanel {

  public ArrayList<Circle> circles; 

  public void paintComponent(Graphics g) {
    Circle c = new Circle(xstart, ystart);   //create a new circle
    ArrayList<Circle> circles = new ArrayList<Circle>();
    if (drawing){ 
        c.draw(g);
        circles.add(c);
        for(int k=0; k<circles.size(); k++){
            circles.get(k).draw(g);
            }
    }           // draw the circle

用于在我的 MouseTest 构造函数中绘制和声明绘制布尔值并绑定到单选按钮的代码。绘制true表示当单选按钮被点击时,它可以绘制圆圈。

JPanel radioPanel = new JPanel(new GridLayout(2,0)); //new GridLayout(y, x)
radioPanel.add(circleButton);
radioPanel.add(trackButton);    
cp.add(radioPanel,BorderLayout.EAST);
drawing = false;

circleButton.addActionListener(new ActionListener() { 
//Set drawing to true when the button is clicked
        public void actionPerformed(ActionEvent ae) {
            drawCircles();
        }

    }); 

 public void drawCircles() {    //initialize tracking to false
    drawing = !drawing;` 

【问题讨论】:

  • 我在原始帖子中添加了代码和一些细节,以了解绘图是什么。

标签: java swing arraylist jpanel jradiobutton


【解决方案1】:

您有几个问题。首先,在您的paintComponent 函数中,您正在创建一个本地的Circles ArrayList。每次调用paintComponent 时,您都在重新创建此变量。相反,只需使用属于该类的圆的 ArrayList。

您遇到的另一个问题是每个圆圈都被绘制了两次,一次是在创建圆圈之后,另一次是在 for 循环中。您应该删除让圆自己绘制的调用,并将它们全部绘制在 for 循环中。

最后,这可能是也可能不是所需的行为,但目前每次调用paintComponent 时都会创建一个新的Circle。你最终可能会得到比你想要的更多的圆圈,因为这个函数可以被调用很多次。您可能需要重新考虑创建新圈子的时间点。

以下解决了前几个问题。

public class MyPanel extends JPanel {

  public ArrayList<Circle> circles = new ArrayList<Circle>(); 

  public void paintComponent(Graphics g) {

    Circle c = new Circle(xstart, ystart);   //create a new circle
    circles.add(c);
    if (drawing){  
        for(int k=0; k<circles.size(); k++){
            circles.get(k).draw(g);
        }
    }           // draw the circle
  }

【讨论】:

  • 就是这样。我在想我必须先画圆,但现在我看到我已经创建了一个新圆。并将其存储在 Arraylist 中,然后 .draw(g) 绘制它。非常感谢!!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-21
  • 2017-12-12
相关资源
最近更新 更多