2011-09-10 16 views
5

Sono in grado di rendere JFrame totalmente trasparente e il JButton è parzialmente trasparente bene fino a quando non muovo il mouse sul pulsante (non fare clic) e spostare il mouse fuori dal pulsante (MouseExited chiamato tramite MouseListener). Quello che succede è che lo sfondo del JButton viene disegnato di nuovo, quindi dopo un paio di movimenti del mouse su e giù il pulsante il pulsante è totalmente opaco.Come creare JButton parzialmente trasparente su JFrame completamente trasparente?

public class ButtonExample extends JWindow 
{ 
    public ButtonExample() 
    { 
     JButton But = new JButton("Testing"); 
     But.setBackground(new Color(0, 0, 0, 200)); 
     But.setForeground(new Color(70, 155, 255)); 
     this.add(But); 
     this.setBackground(new Color(0, 0, 0, 0)); 
     this.setMinimumSize(new Dimension(200,100)); 
     this.setVisible(true); 
    } 

    public static void main(String[ ] Args) 
    { 
     new ButtonExample(); 
    } 
} 
+0

Per un aiuto migliore, pubblicare un [SSCCE] (http://pscode.org/sscce.html). –

+3

Acquista [Filthy Rich Clients] (http://filthyrichclients.org/) di Haase e Guy. Entra in tutti i dettagli necessari per realizzare componenti trasparenti e poi alcuni. In tutto un ** ottimo libro per programmatori Java Swing. –

risposta

8

problema è che le relazioni pulsante essendo completamente opaco quando in realtà non lo è (dovuto al colore parzialmente trasparente)

but.setOpaque(false); 

BTW: come vedi ho cambiato il nome del campo per conformarsi java denominazione convenzioni :-)

Modifica

arggghh .. perso che, mi spiace. Necessità di verificare ciò che facciamo in SwingX, dalla cima della mia testa direi è necessario eseguire l'override paintComponent e gestire lo sfondo dipinto da soli, come

 /** 
     * @inherited <p> 
     */ 
     @Override 
     protected void paintComponent(Graphics g) { 
      if (!isOpaque() && getBackground().getAlpha() < 255) { 
       g.setColor(getBackground()); 
       g.fillRect(0, 0, getWidth(), getHeight()); 
      } 
      super.paintComponent(g); 
     } 

non ho provato, anche se, forse la "sempre più opaco" è tornato di nuovo con il fare così .. tornerà domani

Edit 2

bene, controllato - il codice modificato funziona correttamente. Quindi, in sintesi: componenti con sfondo trasparente

  • devono relazione che essi non sono opache di non confondere il meccanismo di pittura di default
  • deve prendere sopra lo sfondo dipinto e riempirlo con il colore di sfondo stessi (SwingX JXPanel fi fa dal supporto esplicito per una proprietà alpha)

per la vostra convenienza, ecco un piccolo eseguibile con sfondo errata/corretta side-by-side

public class TransparentButton { 

    public TransparentButton() { 
     JWindow incorrectOpaque = createWindow("incorrect opaque", true); 
     incorrectOpaque.setLocation(600, 600); 
     incorrectOpaque.setVisible(true); 
     JWindow correctOpaque = createWindow("correct opaque", false); 
     correctOpaque.setLocation(800, 600); 
     correctOpaque.setVisible(true); 
    } 


    private JButton createButton(final boolean opaque) { 
     JButton but = new JButton("Testing") { 

      /** 
      * @inherited <p> 
      * Overridden to take over background painting with 
      * transparent color. 
      */ 
      @Override 
      protected void paintComponent(Graphics g) { 
       if (!isOpaque() && getBackground().getAlpha() < 255) { 
        g.setColor(getBackground()); 
        g.fillRect(0, 0, getWidth(), getHeight()); 
       } 
       super.paintComponent(g); 
      } 

     }; 
     but.setBackground(new Color(0, 0, 0, 100)); 
     but.setForeground(new Color(70, 155, 255)); 
     but.setOpaque(opaque); 
     return but; 
    } 

    private JWindow createWindow(String text, boolean opaque) { 
     JWindow window = new JWindow(); 
     JButton but = createButton(opaque); 
     window.add(but); 
     window.add(new JLabel(""), BorderLayout.SOUTH); 
     window.setOpacity(0.5f); 
     window.setBackground(new Color(0, 0, 0, 0)); 
     window.setSize(new Dimension(200, 100)); 
     return window; 
    } 

    public static void main(String[] Args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 

       new TransparentButton(); 
      } 
     }); 
    } 

    @SuppressWarnings("unused") 
    private static final Logger LOG = Logger.getLogger(TransparentButton.class 
      .getName()); 
} 
+0

Impostando opaco false lo sfondo del pulsante diventa completamente trasparente (non dipinto) che non è affatto quello che voglio. Potete aiutarmi ulteriormente a ottenere lo sfondo da mostrare quando l'opaco è falso? – Pete

+0

Una soluzione perfetta, molte grazie. – Pete

0

Hai provato translucency?

Il translucent and shaped window API è stato aggiunto per la prima volta all'aggiornamento 10 di Java SE 6 come API privata. Questa funzionalità è stata spostata nel pacchetto AWT pubblico nella versione 7 di JDK.

Penso che i collegamenti sopra riportati possano aiutarti.

+0

Non c'è alcun problema nel rendere la finestra trasparente. La correzione sarebbe come probabilmente include la modifica della pittura del componente stesso (JButton in questo caso) e non è correlata alla finestra diritta. – Pete

+0

hehehe ... sì, è vero! – gumuruh