2010-03-13 4 views
0

J'ai un objet graphique de JPanel et qui fonctionne bien:Graphics2D plusieurs objets

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Rectangle2D; 
import javax.swing.JPanel; 

public class GraphicsTest extends JPanel 
{ 
    private Graphics2D g2d; 
    private String state; 
    private int x, y; 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g2d = (Graphics2D) g; 
     g2d.setClip(0, 0, getWidth(), getHeight()); 

     g2d.setColor(Color.BLACK); 
     g2d.drawString("STATE: " + state, 5, 15); 
     g2d.drawString("Mouse Position: " + x + ", " + y, 5, 30); 

     g2d.setColor(Color.red); 
     Rectangle2D r2d = new Rectangle2D.Double(x,y,10,10); 
     g2d.draw(r2d); 
     Test t = new Test(); 
     super.add(t); 

     repaint(); 
    } 

    public void setState(String state) { this.state = state; } 
    public String getState() { return state; } 

    public void setX(int x) { this.x = x; } 
    public void setY(int y) { this.y = y; } 
} 

J'expérimentait un nouveau composant graphique et quand j'instancier un nouveau test et l'ajouter à rien GraphicsTest se passe. Qu'est-ce que je fais de mal?

import java.awt.Color; 
import java.awt.Graphics; 
import java.awt.Graphics2D; 
import java.awt.geom.Rectangle2D; 
import javax.swing.JComponent; 

public class Test extends JComponent 
{ 
    private Graphics2D g2d; 
    private String state; 
    private int x, y; 

    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     g2d = (Graphics2D) g.create(); 

     g2d.setColor(Color.GREEN); 
     g2d.fill(new Rectangle2D.Double(60, 60, 
       10, 10)); 

     repaint(); 
    } 

    public void setState(String state) { this.state = state; } 
    public String getState() { return state; } 

    public void setX(int x) { this.x = x; } 
    public void setY(int y) { this.y = y; } 

} 

Merci!

Répondre

2

Vous devez ajouter le composant de test une seule fois et définir une mise en page:

public GraphicTest() 
{ 
    super(); 
    setLayout(new BorderLayout()); 
    add(new Test(),BorderLayout.CENTER); 
} 

En outre, ne pas enregistrer Graphics2D objets parce qu'ils ne seront pas valides une fois paintComponent est terminée et ne pas appeler à l'intérieur repaintpaintComponent. Utilisez les minuteurs si vous avez besoin d'animation et appelez repaint dans les méthodes setXXX qui modifient l'aspect du composant.

+0

Alors, n'est-il pas possible de dessiner un nouvel objet graphique sur un JPanel? –

+1

Le composant Test peut avoir sa propre méthode paintComponent qui dessine quelque chose. Vous pouvez le rendre transparent en utilisant la méthode 'setOpaque (false)'. –

+0

Comment puis-je l'ajouter au JPanel? –

Questions connexes