2010-04-15 24 views
3

Cette question a été posée beaucoup mais partout les réponses sont insuffisantes. Je peux obtenir un JFrame pour afficher une image d'arrière-plan très bien en étendant JPanel et paintComponent primordial, comme ceci:Image de fond dans un JFrame

class BackgroundPanel extends JPanel { 
    private ImageIcon imageIcon; 
    public BackgroundPanel() { 
     this.imageIcon = Icons.getIcon("foo"); 
    } 

    @Override 
    protected void paintComponent(Graphics g) { 
     super.paintComponent(g); 
     g.drawImage(imageIcon.getImage(), 0,0,imageIcon.getIconWidth(),imageIcon.getIconHeight(),this); 
    } 
} 

Mais maintenant, comment voulez-vous ajouter un composant au-dessus de ce contexte? Quand je vais

JFrame w = new JFrame() ; 
Container cp = w.getContentPane(); 
cp.setLayout(null); 

BackgroundPanel bg = new BackgroundPanel(); 
cp.add(bg); 

JPanel b = new JPanel(); 
b.setSize(new Dimension(30, 40)); 
b.setBackground(Color.red); 
cp.add(b); 
w.pack() 
w.setVisible(true) 

Il montre le petit carré rouge (ou tout autre composant) et non l'arrière-plan, mais quand je retire cp.setLayout(null);, l'arrière-plan apparaît, mais pas mon autre composant. Je suppose que ceci a quelque chose à faire avec le paintComponent qui n'est pas appelé par LayoutManager null, mais je ne suis pas du tout familier avec LayoutManagers (c'est un projet pour le collège et l'affectation dit spécifiquement de ne pas utiliser LayoutManager) .

Lorsque je crée l'image, l'arrière-plan doit afficher null (et donc, transparant (??)) le carré rouge apparaît donc il se peut que l'arrière-plan soit réellement au-dessus de mes autres composants.

Quelqu'un a-t-il des idées?

Merci

+0

Espérons que ce [thread] (http://stackoverflow.com/a/11428289/1057230) pourrait aussi être utile, sur le sujet :-) –

Répondre

5

Lors de l'utilisation null mise en page (et vous presque jamais devrait) vous devez fournir une limite pour chaque composant, sinon la valeur par défaut (0 x 0, y, 0 largeur, hauteur 0) et le composant ne sera pas afficher.

BackgroundPanel bg = new BackgroundPanel(); 
cp.add(bg); 

ne fournit pas de limite. Vous aurez besoin de faire quelque chose comme:

BackgroundPanel bg = new BackgroundPanel(); 
bg.setBounds(100, 100, 100, 100); 
cp.add(bg); 

Ce qui ferait bg taille 100 x 100 et le placer à 100 x, 100 y sur le cadre.

3

Regardez dans la documentation sur le Root Pane pour toutes les informations dont vous avez besoin. Notez la disponibilité du volet en couches et du volet de verre ainsi que le volet de contenu.

2

Par défaut, tous les composants ont une taille 0. Le simple fait de peindre sur un composant ne donne pas une taille au composant. Vous êtes toujours responsable de la définition de la taille. C'est pourquoi vous devriez toujours utiliser un gestionnaire de disposition. Il s'occupe de toutes les affaires de cette taille pour que vous n'ayez pas à vous inquiéter.

Je ne sais pas pourquoi les débutants pensent toujours qu'ils ne peuvent pas utiliser un gestionnaire de disposition. Oui, il faut encore quelques minutes pour apprendre, mais cela vous évite beaucoup de chagrin à long terme.

Background Panel montre quelques approches. Encore une fois, ils supposent tous deux que vous utilisez un gestionnaire de disposition, vous devrez peut-être définir la taille manuellement.