2010-06-09 3 views
2

Je rencontre des problèmes lors de l'ajout d'une image dans JFrame, il manque quelque chose ou une mauvaise écriture. voici les classes:Problème lors de l'ajout d'une image à JFrame

classe principale:

public class Tester 

    { 
     public static void main(String args[]) 
     { 
      BorderLayoutFrame borderLayoutFrame = new BorderLayoutFrame(); 
      borderLayoutFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      borderLayoutFrame.setSize(600,600); 
      borderLayoutFrame.setVisible(true); 
     } 
    } 

public class BorderLayoutFrame extends JFrame implements ActionListener 
{ 
    private JButton buttons[]; // array of buttons to hide portions 
    private final String names[] = { "North", "South", "East", "West", "Center" }; 
    private BorderLayout layout; // borderlayout object 
    private PicPanel picture = new PicPanel(); 

    // set up GUI and event handling 

    public BorderLayoutFrame() 
    { 
     super("Philosofic Problem"); 
     layout = new BorderLayout(5, 5); // 5 pixel gaps 
     setLayout(layout); // set frame layout 
     buttons = new JButton[ names.length ]; // set size of array 

     // create JButtons and register listeners for them 

     for (int count = 0; count < names.length; count++) 
     { 
      buttons[ count ] = new JButton(names[ count ]); 
      buttons[ count ].addActionListener(this); 
     } 
     add(buttons[ 0 ], BorderLayout.NORTH); // add button to north 
     add(buttons[ 1 ], BorderLayout.SOUTH); // add button to south 
     add(buttons[ 2 ], BorderLayout.EAST); // add button to east 
     add(buttons[ 3 ], BorderLayout.WEST); // add button to west 
     add(picture, BorderLayout.CENTER); // add button to center 
    } 

    // handle button events 

    public void actionPerformed(ActionEvent event) 
    { 

    } 

    } 

I'v essayé d'ajouter l'image dans le centre de mise en page.

est ici la classe d'image:

public class PicPanel extends JPanel 
{ 
    Image img; 
    private int width = 0; 
    private int height = 0; 

    public PicPanel() 
    { 
     super(); 
     img = Toolkit.getDefaultToolkit().getImage("table.jpg"); 
    } 
    public void paintComponent(Graphics g) 
    { 
     super.paintComponents(g); 
     if ((width <= 0) || (height <= 0)) 
     { 
      width = img.getWidth(this); 
      height = img.getHeight(this); 
     } 
     g.drawImage(img,0,0,width,height,this); 
    } 
} 

S'il vous plaît votre aide, quel est le problème? merci

BTW: j'utilise eclipse, dans quel répertoire l'image doit-elle être?

+0

bonne question - exactement ce que * est * le problème? ;-) –

+0

Avez-vous essayé d'ajouter simplement le panneau d'image à un 'JFrame' vide? Que se passe-t-il si vous faites cela? – jjnguy

Répondre

3

Il y a plusieurs problèmes avec le code que vous avez posté:

  • Vous devez utiliser getContentPane().add() au lieu de simplement add() dans votre classe BorderLayoutFrame.
  • Vous devriez vraiment utiliser SwingUtilities.invokeLater() pour lancer votre JFrame à partir de la classe de testeur. Quelque chose comme ceci:

SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     System.setProperty("DEBUG_UI", "true"); 

     BorderLayoutFrame blf = new BorderLayoutFrame(); 
     blf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     blf.setSize(600,600); 
     blf.setVisible(true); 
    } 
}); 
  • Ne pas utiliser boîte à outils pour charger des images! Dans le code suivant, si "Table.jpg" se trouve dans le même package que PicPanel, l'image se chargera correctement.

public PicPanel() { 
    super(); 
    try { 
     rUrl = getClass().getResource("Table.jpg"); 
     if (rUrl != null) { 
      img = ImageIO.read(rUrl); 
     } 
    } catch (IOException ex) { 
     Logger.getLogger(PicPanel.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 
  • En PicPanel.PaintComponent() vous appelez super.paintComponents() est le 'l' un TYPEO?
  • En PicPanel.PaintComponent(), vous ne le font pas besoin tous les trucs largeur/hauteur, faites ceci:

    g.drawImage(img, 0, 0, getWidth(), getHeight(), this);

et éviter l'appel à super.paintComponent tous ensemble parce que vous peignez une image, pourquoi voulez-vous que le panneau soit peint?

Ma mise en œuvre finale de vos affaires:

public class Main { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       System.setProperty("DEBUG_UI", "true"); 

       BorderLayoutFrame blf = new BorderLayoutFrame(); 
       blf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
       blf.setSize(600,600); 
       blf.setVisible(true); 
      } 
     }); 
    } 

} 

class BorderLayoutFrame extends JFrame implements ActionListener 
{ 
    private final BorderLayout layout; 
    private final JButton[] buttons; 
    private final String names[] = {"North", "South", "East", "West", "Center"}; 

    public BorderLayoutFrame() { 
     super("Philosofic Problem"); 
     layout = new BorderLayout(5, 5); 
     getContentPane().setLayout(layout); 
     buttons = new JButton[ names.length ]; 

     for (int i=0; i<names.length; i++) 
     { 
      buttons[i] = new JButton(names[i]); 
      buttons[i].addActionListener(this); 
     } 

     getContentPane().add(buttons[0], BorderLayout.NORTH); 
     getContentPane().add(buttons[1], BorderLayout.SOUTH); 
     getContentPane().add(buttons[2], BorderLayout.EAST); 
     getContentPane().add(buttons[3], BorderLayout.WEST); 
     getContentPane().add(new PicPanel(), BorderLayout.CENTER); 
    } 

    public void actionPerformed(ActionEvent e) { 
     // ignore 
    } 

} 

class PicPanel extends JPanel 
{ 
    private URL rUrl; 
    private BufferedImage img; 



    public PicPanel() { 
     super(); 
     try { 
      rUrl = getClass().getResource("UtilBtn.png"); 
      if (rUrl != null) { 
       img = ImageIO.read(rUrl); 
      } 
     } catch (IOException ex) { 
      Logger.getLogger(PicPanel.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

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

     g.drawImage(img, 0, 0, getWidth(), getHeight(), this); 
    } 

} 
+1

Super - fonctionne très bien !! :-) – firestruq

+0

J'espère que je n'ai pas seulement résolu vos devoirs;) –

2

Dans Eclipse, si vous utilisez le chemin "table.jpg", vous avez besoin que cette image figure au premier niveau du projet.

Pour un peu plus d'informations sur la structure du projet Eclipse voir this Stack Overflow question.

Vous voudrez peut-être essayer d'utiliser un ImageIcon pour afficher l'image au lieu de dessiner sur le panneau. Le code suivant va créer un ImageIcon que vous pouvez simplement ajouter au JPanel.

ImageIcon pic = new ImageIcon(getClass().getResource("myimage.jpeg"); 

Ceci utilise une manière originale de charger l'image pour qu'elle fonctionne dans un fichier Jar.

+0

Je l'ai essayé, je n'ai pas d'erreur mais rien n'apparaît sur le cadre sauf les boutons. – firestruq

+0

@firestruq, j'ai ajouté quelque chose d'autre que vous pourriez vouloir essayer de répondre. – jjnguy

+0

ImageIcon fonctionnera comme le code ImageIO que j'ai posté dans ma réponse. –

Questions connexes