2010-01-07 109 views
2

我想用Java2D来做一些简单的图形编程。我开始很简单,只是试图在JFrame中显示几个圆圈。我成功地显示了一个圆圈,但是当添加第二个圆圈时,仅显示添加到JFrame的最后一个圆圈。我使用Circle类来定义我的圆并重写用于显示它的paintComponent方法。任何关于我可能会做错的建议将不胜感激。下面提供了我的班级Circle和DancingCircles的代码以供参考。用Java2D绘制多个圆圈

import java.awt.*; 
import javax.swing.*; 
import java.awt.geom.*; 
/** 
* 
* @author Paul 
*/ 
public class Circle extends JPanel { 

// Data members for Circle center and radius 
private double centerX, centerY; 
private double radius; 

// No-argument constructor 
Circle() { 
    centerX = 200; 
    centerY = 200; 
    radius = 10; 
} 

// Full-argument constructor 
Circle(double x, double y, double r) { 
    centerX = x; 
    centerY = y; 
    radius = r; 
} 

// Draw a Circle 
protected void paintComponent(Graphics g) { 
    super.paintComponent(g); 

    //Convert to Java2D Object 
    Graphics2D g2 = (Graphics2D) g; 

    // Create the circle 
    Ellipse2D circle = new Ellipse2D.Double(); 
    circle.setFrameFromCenter(centerX, centerY, centerX + radius, centerY + radius); 

    // Draw it 
    g2.draw(circle); 
}// end paintComponent 

// Get/set data members 
public void setCenterX(double x){this.centerX = x;} 
public void setCenterY(double y){this.centerY = y;} 
public void setRadius(double r){radius = r;} 

public double getCenterX(){return centerX;} 
public double getCenterY(){return centerY;} 
public double getRadius(){return radius;} 
}// end class Circle 


import java.awt.*; 
import javax.swing.*; 

/** 
* 
* @author Paul 
*/ 
public class DancingCircles extends JFrame{ 

// Display Dimensions 
public static final int DEFAULT_WIDTH = 400; 
public static final int DEFAULT_HEIGHT = 400; 

// Default constructor 
private DancingCircles() { 
    setTitle("Dancing Circles"); 
    setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT); 

    // Add Circles to JFrame 
    Circle myCircle = new Circle(200.0, 200.0, 20.0); 
    add(myCircle);   // Add circle to frame 
    Circle myCircle2 = new Circle(100.0, 100.0, 30.0); 
    add(myCircle2);  // Add circle to frame 
}// end DancingCircles 

public static void main(String[] args) { 

    EventQueue.invokeLater(new Runnable() 
    { 
     public void run() 
     { 
      DancingCircles dc = new DancingCircles(); 
      dc.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      dc.setVisible(true); 
     } 
    }); 

}// end main 
} 

谢谢!

Paul

回答

0

您正在将每个Circle实现为JPanel。使用BorderLayout的默认布局管理器时,JFrame一次只能使用add(circle)调用一个组件。当你添加第二个圆时,第一个被删除。

要解决这个问题,您可以实现一个绘制多个圆的MultiCircle类,并只将其添加到JFrame中一次。

+0

感谢您的解释。现在有道理! Paul – Paul 2010-01-07 22:27:33

0

我不确定你真的想让你的圈子成为JPanels。他们真的应该看起来更像

class Circle { 
    double x,y,radius; 
    void draw(Graphics g) { 
     g.fillOval(...//etc/. 
    } 
} 

然后有一个JComponent有一堆圈子,并把它放在你的JFrame中。

话虽如此,如果你必须这样做你的方式,那么你应该设置JFrame contentPane的布局为空,并确保你的圈子不透明。您还必须手动调整每个Circle以适应其容器。

+0

好点也!谢谢你的帮助! Paul – Paul 2010-01-07 22:28:50

5

做到这一点的方法是删除从圆类的绘图方法,并在其上创建多个圆圈单面板代替:

import java.awt.*; 
import javax.swing.*; 
import java.awt.geom.*; 
import java.util.*; 

public class Circles extends JPanel 
{ 
    ArrayList<Circle> circles = new ArrayList<Circle>(); 

    public void add(Circle circle) { 
     circles.add(circle); 
    } 

    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     Graphics2D g2 = (Graphics2D) g; 

     for (Circle circle: circles) { 
      Ellipse2D circle2D = new Ellipse2D.Double(); 
      circle2D.setFrameFromCenter(
       circle.getCenterX(), 
       circle.getCenterY(), 
       circle.getCenterX() + circle.getRadius(), 
       circle.getCenterY() + circle.getRadius()); 
      g2.draw(circle2D); 
     } 
    } 
} 
+0

谢谢!我现在看到我的方式的错误!谢谢你的帮助。 Paul – Paul 2010-01-07 22:26:13