2010-09-21 13 views
1

J'ai un JFrame sur lequel j'utilise en remplaçant la méthode paint pour afficher certains graphiques. Je veux aussi ajouter un JPanel qui apparaîtra au-dessus des graphiques. En ce moment, tout ce que je vois, c'est les graphiques créés à partir de la méthode de peinture JFrame.Java - JPanel n'apparaîtra pas sur JFrame lors du remplacement de la peinture de JFrame

Voici mon JPanel:

public class NoteDraw extends JPanel { 

    public NoteDraw() { 
     setSize(200, 100); 
     setBackground(Color.BLACK); 
    } 

    @Override public void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.setColor(Color.red); 
     g.fillRect(0, 0, 100, 100); 
    } 
} 

Voici mon JFrame:

public class ui extends JFrame { 
    public void paint(Graphics g) { 
     //do some drawing here... 
    } 
} 

Voici mon principal:

public class Main { 
    static ui main_gui = new ui(); 

    public static void main(String[] args) { 
     NoteDraw note = new NoteDraw(); 
     main_gui.getContentPane().add(note); 
     main_gui.setVisible(true); 
    } 
} 
+2

Et avant/après "// fais un dessin ici ..." tu as bien sûr "super.paint (g); –

+0

Non, je suis à la fois retardé mentalement et nouveau à Java ... qu'est-ce que super.paint (g); faire de toute façon? – tybro0103

+0

@ tybro0103, il invoquera le comportement de base (le comportement normal du cadre pour peindre son contenu) - tout comme vous avez 'super.paintComponent (g);' dans le panneau. –

Répondre

-1

Rappelez-vous d'appeler super.paint() lorsque vous remplacez votre méthode paint(). De cette façon, vous utilisez toujours le comportement défini dans la classe parente et vous pouvez ajouter vos modifications en toute sécurité.


Ressources:

méthode
+0

Merci, mentionné dans un commentaire plus tôt, mais ce n'est pas le problème. – tybro0103

1

Vous ne devez JAMAIS remplacer la peinture() d'un JFrame (sauf si vous savez vraiment ce que vous faites). Cette méthode est responsable de tout le comportement de peinture optimisé de Swing.

La peinture personnalisée doit toujours être effectuée en remplaçant la méthode paintComponent() d'un composant Swing comme vous l'avez fait dans votre panneau NoteDraw.

La raison pour laquelle le code de la méthode de peinture n'apparaît pas est que le panneau NoteDraw est opaque et que le panneau peint par-dessus le code graphique de votre méthode de peinture. La solution consiste donc à déplacer le code de peinture graphique dans le panneau NoteDraw. Si vous essayez de créer une image d'arrière-plan pour votre cadre, vous pouvez essayer d'utiliser le Background Panel.

Si vous avez vraiment besoin d'une peinture personnalisée, créez un panneau d'arrière-plan et remplacez la méthode paintComponent(). Ensuite, vous définissez la mise en page sur BorderLayout et ajoutez ce panneau à l'image. Ensuite, vous rendez votre panneau NoteDraw non opaque et l'ajoutez au panneau d'arrière-plan personnalisé. Maintenant, l'arrière-plan apparaîtra dans le panneau NoteDraw.