2013-06-28 3 views
0

Je suis réellement envie de charger l'image, mais seulement de dialogue applet ouverte et aucune erreur, mais l'image est loading.the code est ci-dessous iciImage non dessiné dans JPanel.paintComponent

import java.awt.Graphics; 
import java.awt.Image; 
import java.awt.Toolkit; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 

public class Ball extends JPanel{ 
    Image image; 


    public Ball(){ 
    super();  
    image = Toolkit.getDefaultToolkit().getImage("/D:\\lolololo\\tuto\\bin\\sa.jpg"); 
    } 

private Image getResource(String string) { 
    return image; 
    // TODO Auto-generated method stub 

} 

    public void paintComponent(Graphics g){ 


    // Draw our Image object. 
    g.drawImage(image,50,10,574,960, this); // at location 50,10 
    // 200 wide and high 
    } 

    public void main(String arg[]){ 
    JFrame frame = new JFrame("ShowImage"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setSize(800,500); 

    Ball panel = new Ball(); 
    frame.setContentPane(panel); 
    frame.setVisible(true); 
    } 
} 
+3

'"/D: \\ lolololo \\ tuto \\ bin \\ sa.jpg "' ne devrait pas contenir le '/' principal. Il devrait être '" D: \\ lolololo \\ tuto \\ bin \\ sa.jpg "' en supposant que le reste de ce chemin est correct. En outre 'public void principal (String arg []) {' n'est ** pas ** une signature de méthode valide pour la méthode principale! –

+4

Étant donné que Toolkit.getImage (String) 'ne renvoie aucune erreur lorsque l'image n'est pas trouvée, je préfère utiliser' ImageIO' pour les charger. Il fournit beaucoup de sortie utile lorsque quelque chose ne va pas. –

Répondre

1

La façon dont vous chargez l'image est fausse. Cela ne fonctionnera jamais lorsque vous extrayez en tant que pot Runnable.

  • Créer package ("res") à l'intérieur dans votre src

Maintenant charger l'image de cette façon

image = ImageIO.read(Ball.class.getResource("/res/sa.jpg")); 

Cela fonctionne.

Comme l'indique Andrew dans son commentaire classe principale devrait être

public static void main(String arg[]) {} 
1

+1 aux commentaires de @AndrewThompsons.

1) Ci-dessous est incorrect, vous ne honer la chaîne de peinture en appelant la surimpressions mise en œuvre de super.paintComponent(...):

public void paintComponent(Graphics g) { 
    // Draw our Image object. 
    g.drawImage(image,50,10,574,960, this); // at location 50,10 
    // 200 wide and high 

} 

As per docs for paintComponent:

De plus, si vous n'Invocateur la mise en œuvre de super-vous doit honorer la propriété opaque, c'est-à-dire si ce composant est opaque, vous devez remplir complètement l'arrière-plan dans une couleur non-opaque . Si vous n'honorez pas la propriété opaque, vous verrez probablement des artefacts visuels.

devrait être:

public class Ball extends JPanel { 

    BufferedImage image; 

    public Ball() { 
     super(); 

     try { 
      image=ImageIO.read(new File("c:/test.jpg"));//change to your path of file 
     }catch(Exception ex) {//file did not load properly 
      ex.printStackTrace(); 
     } 
    } 

    @Override 
    protected void paintComponent(Graphics g){ 
     super.paintComponent(g); 

     // Draw our Image object. 
     g.drawImage(image,0,0,image.getWidth(),image.getHeight(), this); // at location 50,10 
     // 200 wide and high 
    } 

    @Override 
    public Dimension getPreferredSize() { 
     return new Dimension(image.getWidth(),image.getHeight());//replace with size of image 
    } 

} 

Notez également:

  • Je l'emporterait sur getPreferredSize() de JPanel et retourné Dimension s que je voulais (à savoir la taille de l'image) ou le JPanel ne sera aussi grande comme les composants ajoutés à lui et pas l'image (donc si pas de composants 0,0).

  • J'ai également choisi BufferedImage par rapport à Image et j'ai entouré l'instruction avec un appel d'essai pour vérifier si des erreurs sont levées.

  • Je vois que vous aviez aussi g.drawImage(image,50,10...) pourquoi 50 et 10 et pas 0,0?

2) De plus, cette (comme @AndrewThompson a dit):

image = Toolkit.getDefaultToolkit().getImage("/D:\\lolololo\\tuto\\bin\\sa.jpg");

Pas besoin pour les / des thats que s'il se trouve dans votre forfait classes etc pas quand son sur votre Disque dur à un emplacement défini.

3) également comme l'a dit @AndrewThompson une méthode principale devrait être:

public static void main(String[] args){}

Notez la statique appliquée autre modificateur sage est juste une autre méthode.

4) Ne plus utiliser JFrame#setSize(..) plutôt utiliser LayoutManager et/ou remplacer getPreferredSize et que simplement appeler pack() sur JFrame exemple avant de visible.

5) Veuillez également lire le Concurrency in Swing. en particulier le Event-Dispatch-Thread

+0

Voir aussi [this] (http://stackoverflow.com/questions/14632998/null-exception-while-drawing-image-to-jframe/14633038#14633038) réponse qui montre de nombreux exemples de dessin d'images –

Questions connexes