2010-11-01 11 views
1

Details:rapide Repeindre Question (Canvas objet)

méthode Repaint de mon objet JPanel ne fonctionne pas lorsqu'il est appelé à l'intérieur de l'événement actionPerformed de ma classe principale. Cela fonctionne dans la méthode ImageViewer de la classe principale ImageViewer mais ne fonctionne pas à l'intérieur de la méthode actionPerformed de cette classe.

Ce sont les éléments essentiels de mon code qui ne fonctionnent pas correctement (partie repeindre):

Classe principale:

/** 
* @(#)NeatImageViewer.java 
* 
* NeatImageViewer application 
* 
* @author 
* @version 1.00 2010/11/1 
*/ 

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.*; 
import java.io.*; 
import javax.imageio.*; 
import javax.swing.*; 


public class NeatImageViewer extends JFrame implements ActionListener { 

    GraphicsPanel gp; 

    NeatImageViewer() { 
       //... window components ... 
    } 

    public static void main(String[] args) { 

     NeatImageViewer niv = new NeatImageViewer(); 
     niv.setSize(500,500); 
     niv.setLocationRelativeTo(niv); 
     niv.setVisible(true); 
    } 

    public void actionPerformed(ActionEvent e) { 
      //... 
       gp = new GraphicsPanel(); 
       gp.img = img; 
       gp.repaint(); //<!--- Not Working! 
       this.add(gp); 
      //... 
    } 

} 

GraphicsPanel Classe:

/** 
* @(#)GraphicsPanel.java 
* 
* 
* @author 
* @version 1.00 2010/11/1 
*/ 

import java.awt.*; 
import java.awt.event.*; 
import java.awt.image.*; 
import java.io.*; 
import javax.imageio.*; 
import javax.swing.*; 


public class GraphicsPanel extends JPanel { 
    BufferedImage img; 

    GraphicsPanel() { 
     super(); 
    } 

    protected void paintComponent(Graphics g) { 
     //paint method isn't executed??? 
     super.paintComponent(g); 
     System.out.println("Paint!"); 
    } 

} 
+0

"ne fonctionne pas à l'intérieur de la méthode actionPerformed de cette classe." ne veut rien dire pour nous. Publiez votre SSCCE (http://sscce.org) démontrant le problème. – camickr

Répondre

0

Dans Swing, vous n'utilisez pas de canevas. Vous effectuez une peinture personnalisée sur un JPanel ou JComponent et vous remplacez la méthode paintComponent (...) comme indiqué précédemment. Lire le tutoriel Swing sur Custom Painting pour plus d'informations et des exemples de travail. De plus, avec Swing, il n'est pas nécessaire de créer des composants personnalisés pour afficher une image. Vous utilisez simplement un JLabel avec un ImageIcon. Lisez la section sur "Comment utiliser les icônes".

Marquez le didacticiel pour toutes les bases de Swing.

Edit:

Lorsque vous ajoutez un composant à une interface graphique visible le code de base devrait être:

panel.add(...); 
panel.revalidate(); 
panel.repaint(); 
+0

Merci d'avoir clarifié ça . J'étais un peu confus avec Swing et AWT en les utilisant combinés. Cependant maintenant j'ai suivi le tutoriel et Im utilisant maintenant un JPanel mais ayant exactement le même pronlem: repaint ne fonctionne pas lorsqu'il est appelé depuis la méthode actionPerformed mais fonctionne quand on l'appelle à partir de la méthode ImageViewer de la classe principale ImageViewer. Je pense que je fais toujours quelque chose de mal? – Skyfe

+0

@Skyfe, voir les commentaires d'édition. Vous n'avez toujours pas publié de SSCCE. – camickr

+0

J'ai mis à jour mon post avec mon code et qui ne fonctionne pas (le gp.repaint()) comme je l'ai posté sur mon post principal (ci-dessous EDIT2). A propos de la méthode add, elle peut aussi être omise car la méthode paintComponent ne peint réellement rien, mais j'ai juste essayé de la laisser s'exécuter (ce qui n'a pas du tout été fait avec la méthode repaint sur l'objet) . – Skyfe

1

Vous devez remplacer paintComponent(Graphics g) au lieu de paint(Graphics g). Par conséquent, la méthode que vous avez publiée doit être renommée paintComponent.

ÉDIT: Avez-vous pack() '' votre cadre lorsque votre initialisation est terminée? La méthode repaint() ne fait rien lorsque le composant n'est pas visible. Donc, vous devez l'ajouter d'abord au JFrame, pack() le cadre. Après l'avoir emballé, il n'est plus nécessaire de repeindre.

+0

J'ai renommé le nom de la méthode en paintComponent mais ça ne marche toujours pas – Skyfe

+0

Quand j'emballe le cadre comme: niv.pack() alors j'obtiens une fenêtre avec seulement un titre et une barre de menu et ça ne marche toujours pas – Skyfe

0

(je suis Skyfe mais d'un autre IP est donc pas « connecté » et Je ne peux pas commenter)

Je suis désolé mais je ne comprends pas quel est le problème ???

J'ai offert mon code et il N'exécute PAS la fonction paintComponent en appelant repaint de la méthode actionPerformed. Copiez simplement mon code et compilez-le avec un compilateur java et il n'exécute pas la méthode paintComponent lors de l'exécution d'une action que je peux dire car j'ai utilisé une méthode System.out.println() dans la méthode paint. Et non ça ne peint rien car j'essaye juste de vérifier si elle appelle la méthode de peinture TOUT parce que je mets une sortie système dans la méthode paintComponent qui n'est pas exécutée lors de l'utilisation de repaint. C'était juste un test et ça n'a pas marché.

Donc ce que vous voulez dire par où est le SSCCE, c'est tout le code que j'ai.J'ai compilé exactement le code que j'ai posté dans mon post principal et le problème avec cela est qu'il ne montre aucune sortie du système lorsqu'une action a été effectuée (et l'événement repaint a été appelé). Je ne vois pas ce qui manque dans mon message?

+0

Je vous ai donné un lien sur la façon d'écrire un SSCCE dans le commentaire sur votre question originale! Je vous ai également fourni un lien lorsque j'ai répondu à votre autre question il y a 2 jours: http://stackoverflow.com/questions/4060006/readding-panel-to-layout-after-editing-panel. Il n'y a aucune raison pour que vous ne sachiez pas ce qu'est un SSCCE, on vous l'a demandé plus d'une fois. Non seulement vous pouvez rechercher sur le Web pour savoir ce que SSCCE est! – camickr

+0

Oui, il est dit que c'est un: court, autonome, correct (compilable), exemple. Quel est mon post, je ne comprends toujours pas pourquoi mon message ne serait pas un "SSCCE". J'ai posté le bon code que j'ai utilisé, le problème et court ... – Skyfe