2010-01-07 6 views
2

J'essaie d'utiliser Java2D pour faire de la programmation graphique simple. J'ai commencé facile, essayant juste d'afficher quelques cercles dans un JFrame. J'ai réussi à afficher un seul cercle, mais lors de l'ajout d'un second cercle, seul le dernier cercle ajouté au JFrame est affiché. J'utilise la classe Circle pour définir mon cercle et remplacer la méthode paintComponent utilisée pour l'afficher. Toute suggestion sur ce que je pourrais faire de mal serait grandement appréciée. Le code pour mes classes Circle et DancingCircles est fourni ci-dessous pour référence.Dessin de plusieurs cercles avec 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 
} 

Merci!

Paul

Répondre

0

vous implémentez chaque cercle comme JPanel. Avec le LayoutManager par défaut de BorderLayout, le JFrame ne peut contenir qu'un seul composant à la fois lorsqu'il est appelé avec add(circle). Lorsque vous ajoutez le deuxième cercle, le premier est supprimé. Pour résoudre ce problème, vous pouvez implémenter une classe MultiCircle qui dessine plusieurs cercles et l'ajouter une seule fois au JFrame.

+0

Merci pour l'explication. Cela a du sens maintenant! Paul – Paul

0

Je ne suis pas sûr que vous voulez vraiment que vos cercles soient des JPanels. Ils devraient vraiment regarder plus comme

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

Testez ensuite JComponent qui a un tas de cercles, et mettez dans votre JFrame. Cela dit, si vous devez faire comme vous l'avez, alors vous devez mettre la disposition de JFrame contentPane à null, et assurez-vous que vos cercles ne sont pas opaques. Vous devrez également redimensionner manuellement chaque cercle pour l'adapter à son conteneur.

+0

Des points positifs aussi! Merci de votre aide! Paul – Paul

5

La façon de le faire est de supprimer les méthodes de dessin de la classe de cercle et de créer un seul panneau avec plusieurs cercles à la place:

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

Merci! Je vois l'erreur de mes manières maintenant! Merci de votre aide. Paul – Paul

Questions connexes