2011-05-08 3 views
4

J'ai un translucide JPanel. J'ai créé un personnalisé JButton en étendant JButton car j'avais besoin d'un bouton avec des coins arrondis et je voulais y ajouter quelques effets. J'ai fait le bouton non-opaque. Quand j'ajoute ce bouton à mon JPanel translucide, ça paraît bien. Mais en cas de retournement, une tache noire est peinte derrière le bouton qui a l'air vraiment merdique. J'ai cherché une solution sur le net mais je n'ai pas trouvé de solution utile. Ce problème est également décrit à http://www.java.net/node/661798 mais je ne pouvais vraiment faire la suggestion de kirillcool élaborer ..... Toute aide sera appréciéeJButton transparent toujours peindre son fond

+1

Pas une réponse à votre question, mais avez-vous essayé de télécharger/utiliser un autre look & feel au lieu d'écrire le tien? J'ai utilisé synthetica dans mon dernier projet, et il était assez bon et "fantaisie" – Kaj

Répondre

7

Je crois que vous devez ajouter:

button.setContentAreaFilled(false); 
+0

oui cela fonctionne très bien –

0

ne sais pas si quelqu'un est toujours intéressé ... vous pouvez résoudre le problème en remplaçant la méthode paintComponent() pour laisser Java dessiner le JButton dans n'importe quelle forme que vous aimez. il vous suffit de définir l'arrière-plan de l'objet Graphics sur transparent avec la méthode setBackground(). Vous devez également effacer l'objet Graphics AVANT de dessiner dessus avec la méthode clearRect(), puis le remplir à nouveau avec le niveau alpha de l'arrière-plan de votre JButton. voici mon morceau de code .. il montre l'override paintComponent(). en le collant dans votre JButton vous devriez obtenir un JButton avec des bords arrondis, même si son sur fond semi-transparant

private int outerRoundRectSize = 10; 
private int innerRoundRectSize = 8; 

public void paintComponent(Graphics g) 
{ 
    int h = getHeight(); 
    int w = getWidth(); 

    Graphics2D g2d = (Graphics2D) g.create(); 
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON); 

    Color GP = null; 

    //////////////get rid of the black background//////////////////////// 
    g2d.setBackground(new Color(0,0,0,0.0f)); 
    g2d.clearRect(0, 0, w, h); 
    g2d.setPaint(new Color(0,0,0,0.3f)); 
    g2d.fillRect(0, 0, w, h); 
    //////////////get rid of the black background//////////////////////// 

    ButtonModel model = getModel(); 
    if(!model.isEnabled()) 
    { 
     setForeground(Color.GRAY); 
     GP = new Color(0.5f,0.2f,0.6f); 
    } 
    else 
    { 
     setForeground(Color.WHITE); 
     if(model.isRollover()) 
     { 
      GP = new Color(0.5f,0.2f,0.6f); 
     } 
     else 
     { 
      GP = new Color(0.0f,1.0f,0.0f); 
     } 
    } 
    g2d.setPaint(GP); 
    Color p1 = null; 
    Color p2 = null; 

    if(getModel().isPressed()) 
    { 
     GP = new Color(1.0f,0.0f,0.0f); 
     g2d.setPaint(GP); 
     p1=new Color(0.12f,0.7f,0.3f); 
     p2=new Color(0.7f,0.5f,0.6f); 
    } 
    else 
    { 
     p1=new Color(0.0f,0.5f,0.7f); 
     p2=new Color(0.0f,1.0f,1.0f); 
     GP = new Color(0.0f,0.0f,1.0f); 
    } 

    RoundRectangle2D.Float r2d = new RoundRectangle2D.Float(0, 0, w - 1, h - 1, outerRoundRectSize, outerRoundRectSize); 
    Shape clip = g2d.getClip(); 
    g2d.clip(r2d); 
    //g2d.fillRect(0, 0, w, h); 
    g2d.fillRoundRect(0, 0, w, h, outerRoundRectSize, outerRoundRectSize); 
    g2d.setClip(clip); 
    g2d.setPaint(p1); 
    g2d.drawRoundRect(0, 0, w - 1, h - 1, outerRoundRectSize,outerRoundRectSize); 
    g2d.setPaint(p2); 
    g2d.drawRoundRect(1, 1, w - 3, h - 3, innerRoundRectSize,innerRoundRectSize); 

    g2d.dispose(); 
    super.paintComponent(g); 
} 
+0

ne pas écrire de code personnalisé lors de la configuration d'une seule propriété fait le thrick :-) btw: s'il vous plaît apprendre les conventions de nommage java et respectez leur. – kleopatra