2011-02-11 4 views
0

Ok Je me demande pourquoi le code ci-dessous n'affichera pas le JLabel. MyPanel est ajouté correctement à un JFrame et à tout parce que tout affiche mais ne dessine pas le JLabel.Problème de peinture Java

Toute aide est appréciée.

public class MyPanel extends JPanel { 
    private Root root; 
    ... 

    public void paintComponent(Graphics g) 
    { 
    super.paintComponent(g); 
    Graphics2D g2 = (Graphics2D) g; 
    root.paint(g2); 
    } 
} 

class Root { 
    private Node1 node1; 

    ... 
    public void paint(Graphics g) { 
    node1.paint(g); 
    } 
} 

class Node1 { 
    ... 
    public void paint(Graphics g) { 
    JLabel jtp = new JLabel(); 
    jtp.setLocation((int) x, (int) y); 
    jtp.setSize((int) width, (int) height); 
    jtp.setLocation(40, 40); 
    jtp.setSize(40, 40); 
    jtp.setText("Hello world"); 
    //jtp.setVisible(true); 
    jtp.paint(g); 
    } 
} 

Répondre

3

je vous suggère de ne pas ajouter des composants à un conteneur dans une méthode de peinture 1) vous n'avez pas le contrôle absolu quand ou même si une méthode de peinture sera appelée et 2) la peinture et paintComponent doivent Soyez aussi rapide que possible, et ce n'est pas le moment ou le lieu de mettre à jour une interface graphique. 3) Puisque la peinture est souvent appelée plusieurs fois, vous ajouterez des composants plusieurs fois à votre conteneur, et tout sera hors de votre contrôle direct. De plus, pendant que vous ajoutez un composant dans Root (quelle que soit la racine car elle ne s'étend pas JComponent, JPanel ou similaire) dans la méthode paint, l'objet Root n'est jamais ajouté à quoi que ce soit d'autre , et il est donc logique que rien de "ajouté" à un composant qui n'est pas ajouté à une fenêtre de niveau supérieur ne soit visible.

Conclusion: Je pense que vous avez besoin d'une nouvelle conception de votre solution. Si vous nous en dites plus à ce sujet, nous pouvons vous aider. Ensuite, nous aurons besoin de parler de l'utilisation des gestionnaires de disposition et pourquoi la mise en position absolue et la taille des composants est généralement désapprouvée. Si tout ce que je dis est confus, s'il vous plaît demander des éclaircissements, ou si quelque chose ne va pas, s'il vous plaît aidez-moi à le corriger!

2

Vous ne devriez pas créer votre JLabel à l'intérieur de la méthode de peinture - au lieu de cela, créez-le une fois lors de l'initialisation de votre MyPanel. Votre étiquette est une sorte de composant de rendu pour vos nœuds, ce qui en principe est une bonne chose. Vous pouvez regarder comment fonctionnent les moteurs de rendu pour JTable, JList, JTree.

Dans votre cas, ne définissez pas l'emplacement de votre étiquette (cela ne change rien car sa méthode de peinture attend que son objet graphique soit orienté par son propre coin supérieur gauche), traduisez plutôt le contexte graphique. :

Graphics copy = g.create((int)x, (int)y, (int)width, (int)height); 
jtp.paint(copy); 

(. Graphics2D a des méthodes plus fantaisie pour déplacer, rotation, mise à l'échelle du contexte, aussi)

Autre que cela, je ne vois pas de problème. Assurez-vous que votre méthode Node1.paint() est réellement appelée en mettant System.out.println() dedans.