2010-03-13 4 views
3

J'ai essayé la méthode add() mais rien ne s'affiche lorsque j'essaie d'ajouter Test to GraphicsTest. Comment devrais-je l'ajouter? Quelqu'un peut-il me montrer? J'ai inclus le code que j'utilise.Personnalisé JComponent ne s'affiche pas en mode personnalisé JPanel

Ceci est mon chemin et ça ne fonctionne pas. Quelqu'un peut-il me montrer ou me faire prendre conscience de ce qu'est réellement le problème?

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

public class Test extends JComponent 
{ 
    @Override 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponent(g); 
     Graphics2D g2d = (Graphics2D) g.create(); 
     g2d.setColor(Color.red); 
     g2d.drawString("Hello", 50, 50); 
     g2d.dispose(); 
    } 
} 

Voici l'autre classe:

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; 

    GraphicsTest() 
    { 
     Test t = new Test(); 
     t.setVisible(true); 
     add(t); 
    } 

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

     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); 

     g2d.dispose(); 
    } 

    public void setState(String state) { this.state = state; } 
    public String getState() { return state; } 
    public void setX(int x) { this.x = x; repaint(); } 
    public void setY(int y) { this.y = y; repaint(); } 
} 
+0

Ce code fonctionne bien pour moi, bien que j'ai dû créer un JFrame et y ajouter le GraphicsTest. –

+0

L'objet de test "hello" apparaît pour vous? –

Répondre

1

Votre problème est g2d.dispose(). Sortez-les et ça devrait marcher. Je soupçonne que cela peut provoquer un comportement différent sur différents jvms. Il semble que ce qui se passe est que l'objet g2d est utilisé pour dessiner des choses sur l'objet GraphicsTest. Ensuite, le même objet g2d essaie de dessiner des choses sur l'objet Test, mais il a été disposé de sorte qu'il ne puisse rien dessiner. Il y a des cas où vous voulez appeler g2d.dispose() mais ce n'est pas l'un d'entre eux.

L'autre chose que je l'ai fait pour rendre votre travail de code a été changé, je le gestionnaire de mise en page:

setLayout(new BorderLayout()); 
add(t, BorderLayout.CENTER); 

La mise en page par défaut devrait être la mise en page de flux. Je ne suis pas sûr de savoir pourquoi cela ne fonctionnerait pas avec Flow Layout.

+0

J'ai essayé votre suggestion et supprimé les deux de la g2d.dispose(); en vain. –

+1

Oups, j'ai effectivement fait deux changements dans le code pour le faire fonctionner. Je ne pensais pas que l'autre changement ferait une différence. –

+0

Merci beaucoup! Cela fonctionne enfin! Il m'a fallu toute la journée pour essayer de comprendre ça ... Est-ce que Sun travaille à réparer cet ennui ou est-ce documenté ailleurs? –

Questions connexes