2009-11-19 10 views
11

J'essaie d'ajouter un JLayeredPane à un JPanel, puis d'ajouter une image (icône JLabel) et un bouton à JLayeredPane, mais aucun n'apparaît. J'ai testé l'image sans le bouton et la couche layered donc je sais que cela fonctionne. Voici une partie du code que j'utilise. Y a-t-il quelque chose qui me manque ou qui ne va pas?Ajout de JLayeredPane à JPanel

 

public class MyClass extends JPanel 
{ 
    private JLayeredPane layeredPane; 
    private JLabel imageContainer = new JLabel(); 
    private JButton info = new JButton("i"); 

    MyClass(ImageIcon image) 
    { 
     super(); 

     this.imageContainer.setIcon(image); 

     this.layeredPane = new JLayeredPane(); 
     layeredPane.setPreferredSize(new Dimension(300, 300)); 
     layeredPane.add(imageContainer, new Integer(50)); 
     layeredPane.add(info, new Integer(100)); 

     this.add(layeredPane); 
    } 
}  
 
+1

Sans voir où et comment vous ajoutez le MyClass à un cadre de quelque sorte, on ne sait pas où vous êtes allé mal. –

Répondre

15

De l'tutorial

Par défaut, un volet en couches n'a pas gestionnaire de mise en page. Cela signifie que vous devez généralement écrire le code qui positionne et dimensionne les composants que vous avez placés dans un volet en couches.

Voir les modifications apportées à votre code:

import java.awt.*; 
import javax.swing.*; 
public class MyClass extends JPanel { 
    private JLayeredPane layeredPane; 
    private JLabel imageContainer = new JLabel(); 
    private JButton info = new JButton("i"); 

    MyClass(ImageIcon image) { 
     super(); 

     this.imageContainer.setIcon(image); 

     this.layeredPane = new JLayeredPane(); 
     layeredPane.setPreferredSize(new Dimension(300, 300)); 
     layeredPane.add(imageContainer, new Integer(50)); 
     layeredPane.add(info, new Integer(100)); 
     this.add(layeredPane); 
     // CHANGED CODE 
     // Manually set layout the components. 
     imageContainer.setBounds(0, 0, 
            image.getIconWidth(), 
            image.getIconHeight()); 
     info.setBounds(200, 00, 50, 40); 
    } 
    public static void main(String [] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new MyClass(new ImageIcon("logo.png") )); 
     frame.pack(); 
     frame.setVisible(true); 
    } 
}  

Notes complémentaires:

1) Il est préférable (à mon avis) pour placer l'accolade d'ouverture dans la même ligne. Voilà à quoi ressemble la plupart des codes Java.

2) Évitez d'hériter de JPanel (ou de tout autre composant) si vous ne créez pas vraiment une sous-classe. Vous pouvez l'utiliser directement sans avoir à hériter (à moins que vous créez en effet un nouveau composant.

+2

En réponse à la remarque d'accolade, la raison pour laquelle ME ne le fait pas est due à la lisibilité des espaces blancs, ce qui est un problème de conception visuelle car il n'a aucun impact sur la proformance. ça aide les autres (pas tous) qui ne sont pas familiers avec le code – asawilliams

+0

@asawilliams: En effet, il n'a pas d'autre impact que la lisibilité du code Si vous étiez déjà conscient de ce style et que vous l'évitez intentionnellement, je pense que c'est correct. Je fais la recommandation quand même pour ceux qui ne la connaissent pas, j'ai trouvé des développeurs venant d'autres langages de programmation qui résistent à adopter ce style. ogram dans d'autres accolades langage de programmation avant? Quant à l'aide, vous êtes les bienvenus;) – OscarRyz

+0

ouais, C, C++, C#, Actionscript 3, php, .... C'était juste comme on m'a enseigné. Je peux comprendre comment certains programmeurs aiment avoir du code serré, mais je ne vois pas d'autre raison de le faire que la préférence. – asawilliams

4

JLayeredPane a un gestionnaire de mise en page nulle par défaut, donc dans votre exemple, vous devrez définir l'emplacement et la taille des composants de l'enfant. Vous pouvez définir un gestionnaire de disposition sur le JLayeredPane, mais cela annulera probablement le rendu en couches que je suppose que vous voulez, puisque vous utilisez un volet en couches.