2009-12-02 11 views
1

J'ai un JPanel pour lequel j'ai mis une image en arrière-plan. J'ai besoin de dessiner un tas de cercles sur le dessus de l'image. Maintenant, les cercles seront positionnés en fonction d'une coordonnée x, y, et la taille sera basée sur une taille d'entier. C'est ce que j'ai comme cours.Comment dessiner un cercle sur JPanel? Java 2D

import java.awt.Dimension; 
import java.awt.Graphics; 
import java.awt.Image; 
import javax.swing.JPanel; 

class ImagePanel extends JPanel { 

    private Image img; 
    CircleList cList; //added this 

    public ImagePanel(Image img) { 
     this.img = img; 
     Dimension size = new Dimension(img.getWidth(null), img.getHeight(null)); 
     setPreferredSize(size); 
     setMinimumSize(size); 
     setMaximumSize(size); 
     setSize(size); 
     setLayout(null); 

     cList = new CircleList(); //added this 
    } 

    public void paintComponent(Graphics g) { 
     g.drawImage(img, 0, 0, null); 

     cList.draw(null); //added this 
    } 
} 

Comment puis-je créer une méthode pouvant effectuer cette opération?

+0

Je viens de voir que Ellipse2D a besoin d'un double ou d'un flotteur, je suppose que je peux utiliser un double pour la taille. – user69514

Répondre

2

Votre approche peut être quelque chose de semblable à cela, dans lequel vous utilisez une classe CircleList pour contenir tous les cercles et la routine de dessin trop:

class CircleList 
{ 
    static class Circle 
    { 
    public float x, y, diameter; 
    } 

    ArrayList<Circle> circles; 

    public CirclesList() 
    { 
    circles = new ArrayList<Circle>(); 
    } 

    public void draw(Graphics2D g) // draw must be called by paintComponent of the panel 
    { 
    for (Circle c : circles) 
     g.fillOval(c.x, c.y, c.diameter, c.diameter) 
    } 
} 
+0

Ok, donc j'ai créé I CircleList avec deux cercles arbitraires dans la liste chaînée. Lorsque j'appelle circleList.draw (null) dans la classe ImagePanel, rien ne se passe. L'interface graphique gèle réellement. Quel est le paramètre de la méthode draw quand je l'appelle? – user69514

+0

j'ai noté dans le message original les choses que j'ai ajouté – user69514

+0

ok je viens de casté à Graphics2D. merci – user69514

1

La chose la plus simple à faire serait de placer quelque chose le long de ces lignes dans votre méthode paintComponent.

int x = ...; 
int y = ...; 
int radius = ...; 
g.drawOval(x, y, radius, radius); 
+0

-1 L'utilisation de getGraphics() ne fonctionnera PAS. Oui, il dessine l'ovale une fois, mais il sera supprimé dès que JAVA déterminera que le panneau doit être repeint. La peinture personnalisée est effectuée en remplaçant la méthode paintComponent(). – camickr

+0

Vous vous moquez de moi? Ensuite, laissez simplement 'getGraphics()' et déplacez le code dans la méthode 'paintComponent'. – jitter

+0

@camickr. Merci à vous bien que j'ai fondamentalement donné la même réponse que Jack je suis sur -1 – jitter

1

Eh bien, vous voudrez probablement créer une ArrayList pour stocker les informations sur les cercles à dessiner. Ensuite, lorsque la méthode paintComponent() est invoquée, vous n'avez qu'à parcourir la ArrayList et dessiner les cercles.

Custom Painting Approaches montre comment cela peut être fait pour un rectangle. Vous pouvez également modifier le code d'un ovale. Vous ajouteriez probablement des méthodes pour mettre à jour le tableau avec les informations d'emplacement plutôt que de le faire dynamiquement.

1

Avez-vous regardé JXLayer? C'est une bibliothèque géniale qui vous permet de superposer une peinture spéciale sur n'importe quel élément graphique de manière évidente. Je crois que cela sera inclus dans les principales bibliothèques java pour JDK7

Questions connexes