2015-12-13 3 views
0

J'ai une classe UITextPane qui s'étend JTextPane et redéfinit la méthode paintComponent(g), comme ceci:Java: JTextPane ne charge pas transparent?

package com.ritcat14.GotYourSix.graphics.UI; 

import com.ritcat14.GotYourSix.util.ImageUtil; 

import java.awt.Graphics; 
import java.awt.image.BufferedImage; 

import javax.swing.JTextPane; 

public class UITextPane extends JTextPane { 

    private BufferedImage img; 

    public UITextPane() { 
     img = ImageUtil.getImage("/ui/panels/helpBackground.png"); 
    } 

    @Override 
    public void paintComponent(Graphics g) { 
     g.drawImage(img,0,0,null); 
     super.paintComponent(g); 
    } 
} 

Puis dans ma classe Game.java, créer et ajouter le composant à l'JFrame en utilisant GridBagConstraints comme tel:

game.textPane = new UITextPane(); 
    game.textPane.setEditable(false); 
    game.textPane.setForeground(new Color(0xffC20F1B)); 
    game.textPane.setBackground(new Color(1,1,1, (float) 0.01)); //Set transparent so we can see the text 

    //create and set font 
    .... 

    JScrollPane sp = new JScrollPane(game.textPane); 
    sp.setPreferredSize(new Dimension(400,400)); 
    c.anchor = GridBagConstraints.LINE_END; 
    game.frame.add(sp, c); 

Le textPane.paintComponent(g) est appelé à chaque fois que la méthode de rendu du jeu est appelée.

Mon problème: L'image que j'ai stockée est simplement une image transparente 400x400 que je dessine au JTextPane dans la classe UITextPane. Cependant, le résultat se présente comme suit:

enter image description here

Et après avoir chanté dans le fond devient noir comme ceci:

enter image description here

Toutes les idées que je fais mal/ne pas faire ? Merci

Répondre

1

Certains LaF ne respectent pas les propriétés d'arrière-plan. Quoi qu'il en soit, vous devriez utiliser setOpaque pour réaliser ce que vous voulez.

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 
     @Override 
     public void run() { 
      JFrame mainFrame = new JFrame("test"); 
      mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

      //Opaque (default behaviour) 
      Container pane = mainFrame.getContentPane(); 
      JTextPane jtp1 = new JTextPane(); 
      jtp1.setOpaque(true); 
      jtp1.setText("this JTextPane is not transparent"); 
      jtp1.setEditable(false); 

      //Not opaque (ie transparent) 
      JTextPane jtp2 = new JTextPane(); 
      jtp2.setOpaque(false); 
      jtp2.setText("this JTextPane is transparent"); 
      jtp2.setEditable(false); 

      pane.setLayout(new FlowLayout()); 
      pane.setBackground(Color.LIGHT_GRAY); 
      pane.add(jtp1); 
      pane.add(jtp2); 
      mainFrame.pack(); 
      mainFrame.setVisible(true); 
     } 
    }); 
} 
+0

pourriez-vous s'il vous plaît expliquer/montrer comment l'utiliser? –

+0

Désolé, sur mon téléphone en ce moment ... Faites simplement setOpaque (false) sur le composant que vous voulez être transparent. Veillez à ce que les parents soient également transparents si nécessaire. – Sharcoux