2011-10-04 9 views
5

Sì, questa domanda è ovunque. Ma tutte le soluzioni (di lavoro) utilizzano il toolkit AWTUtilities, che è limitato.Java - il vecchio JFrame trasparente, senza librerie ristrette

Così. Voglio solo controllare l'opacità della mia finestra. Non c'è bisogno di modellare o non decorare. Solo un contentPane trasparente (facile) e uno sfondo trasparente JFrame (incredibilmente difficile).

Avrei giurato di avere la giusta combinazione di cose ieri, ma ora non riesco a riprodurlo. Inoltre ci sono alcune soluzioni là fuori senza usare AWTUtilities, ma non funzionano ... qualcuno ha una buona soluzione?

Un esempio del mio codice non riuscendo:

public static void main(String[] args) { 
    JFrame test = new JFrame(); 
    test.setSize(400, 400); 
    test.setLocationRelativeTo(null); 
    test.setUndecorated(true); 
    test.setBackground(new Color(0, 0, 0, 0)); 
    test.getContentPane().setBackground(new Color(0,0,0,0)); 
    test.setVisible(true); 
} 

ma questo fa solo un quadrato bianco. Chiudi ma senza sigaro. Ho anche provato a sovrascrivere il metodo di pittura, e qualcuno stava dicendo qualcosa sul lancio del canale alfa, ma questo lo rendeva nero (ovviamente). Quindi ... Stack Overflow è.

Se c'è un duplicato che risponde esattamente a questo, per favore indicatelo e io cancellerò immediatamente.

Aggiornamento Per richieste nei commenti, ecco una storia di come sono arrivato qui:

Il primo collegamento tutti arriva è how to create translucent and shaped windows. Questo ha diverse linee in là simile a" ... il telaio con traslucido un livello di opacità del 75%. " Quindi ... sembra che siano definiti uguali, almeno in quell'articolo. Sfortunatamente usano la libreria.

Un paio di link che ho potuto inseguire giù:

una soluzione non-lavoro "lavoro" è segnalato in http://www.java-gaming.org/index.php?topic=24635.0 che mostra un po 'di speranza, ma non ho potuto farlo funzionare.

http://techgearup.wordpress.com/2008/09/19/transparent-jframe-background/ è un modo hacker con schermate ed è duplicato in pochi altri luoghi.

+3

È possibile utilizzare Java 7? Potresti collegare ad alcune delle soluzioni di lavoro in modo da vedere cosa hai provato? –

+1

Si prega di non [confondere] (http://stackoverflow.com/questions/3517722/java-transparent-jscrollpane/3518047#3518047) _opacity_ e _transparency_. – trashgod

+0

Concordato, questa è una delle nuove funzionalità di Java 7: http://download.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html –

risposta

1

Non è possibile farlo senza utilizzare Java v.6u10 + o librerie di terze parti che chiamano codice nativo. In Swing Frames, Dialogs e Windows sono considerati 'componenti di livello superiore' e sono resi nel sistema di finestre sottostante. Prima di Java v6u10, tutti i componenti di primo livello avevano uno sfondo grigio opaco predefinito e non c'era modo di cambiare questo codice Java.

+0

Apparentemente Java 6u10 è uscito dall'ottobre 2008, che è abbastanza lungo da permettere ai miei utenti di averlo. Come può essere realizzato nelle versioni successive a Java 6u10? – Ben

+0

In 6u10 - devi usare AWTUtilities, dopo 7 hanno aggiunto metodi a Window e alcune altre classi. http://download.oracle.com/javase/tutorial/uiswing/misc/trans_shaped_windows.html#6u10 (Mi rendo conto che hai impostato AWTUtilities è "limitato", ma in pratica è l'unico modo che Java ti offre per farlo.) – Nate

+0

OK grazie per l'aiuto. Sto lavorando a un progetto open-source e non sono sicuro dell'atteggiamento verso file non limitanti. Ma questa è una domanda diversa :) – Ben

0

Sigh Mi sono imbattuto nello stesso problema e, dopo un lungo periodo di lavoro, ho trovato un modo per ottenere uno schermo trasparente impostato correttamente sul mio computer. Tuttavia, molte cose smettono di funzionare non appena si imposta la cornice trasparente. Se usi la dichiarazione JTextArea ovunque, smette immediatamente di funzionare. Non farà nemmeno un errore!

Quindi ecco il codice, spero che questo sia di qualche utilità. Risposta Plz se si esegue un JScrollPane con esso :)

public class gui { 
    public frame f; 
    public String name = "Transparent?"; //name your frame * 
    public JButton exit = new JButton("Exit"); 
    public gui(){ //non-static context 
     f = new JFrame(name); 
     f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); //* 
     f.setLocationRelativeTo(null); 
     f.setExtendedState(f.getExtendedState() | JFrame.MAXIMIZED_BOTH); 
     //maximizes window. if you dont want it, f.setSize(int, int) 
     f.setUndecorated(true); //necessary for setOpacity 
     f.setOpacity(.7f); //achieve trasparancy 
     f.setVisible(true); //show window 
     exit.addActionListener(new ActionListener(){ 
      public void actionPerformed(ActionEvent arg0){ 
       System.exit(0); 
      } 
     }); 
     f.add(exit, BorderLayout.CENTER); 
     //since X is not available in the window, make a button to exit 
    } 

    public static void main(){ 
     new gui(); 
    } 
} 
//* Note: since the default Window manager is set off with setUndecorated(true), 
// the name and buttons won't really show. 
+0

Oh, ho dimenticato di dirlo, JTextField funziona ancora. L'unica cosa che non funziona fino ad ora (le cose che stavo usando) è JTextArea e JScrollPane Non ho ancora testato i bordi ma non è la preoccupazione principale – nkazuko

+1

per favore impara le convenzioni di denominazione java e tieniti stretto – kleopatra