JFrame Transparente e JPanel normal

Ola caros amigos do guj, gostaria de saber se alguem pode me ajudar. Estou fazendo uma aplicação swing. Gostaria de deixar a interface grafica bem bonita, porem nao gostaria que ficasse quadradona que nem é normalmente. Meu objetivo é o seguinte: Colocar o JFrame 100% transparente, porem um JLabel normal, sem transparencia, pois nele irei colocar uma imagem, quando deixo a janela transparente, todo o conteudo dela fica transparente, alem de ficar aquelas bordas do JFrame , pq a imagem tem varias formas e nao preenche o quadradao do JFrame. Queria fazer telas personalizadas, por exemplo: tem gente que faz jogos em java e as telas ficam bem feitas, sem ser aquele quadradao que fica na maioria dos aplicativos, um bom exemplo: Quem ja viu a tela que carrega o Photoshop Cs5, tipo, nao é quadrada e tem as transparencias sabe, queria deixar naquele nivel.

Se alguem puder me ajudar, agradeço.

Então dá uma pesquisada sobre LookAndFeel, ou seja, tema da aplicação. Você mesmo pode personalizar o seu.
E para setar transparência em janelas swing dá uma olhada nesse link por exemplo: http://javafree.uol.com.br/topic-882662-Janelas-transparentes.html

Boa pesquisa e até mais.

Cara, se é o que eu entendi, até tem como… (Mas vai ser numa base de gambiarra, ok?)
Levando em consideração que tu vai ter um frame que não vai ser movido(tipo quando inicia o photoshop), tu vai ter que fazer o seguinte:

1-Criar um JPanel;
2-Sobrescrever o metodo paintComponet() do JPanel;
3-Fazer o JPanel tirar um PrintScreen do que está atrás da janela e tornar esse o plano de fundo;
4-Adicionar o JPainel personalizado num JFrame;

Parece difícil, mas é bem barbada! É só implementar o código abaixo…

import java.awt.AWTException;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.image.BufferedImage;
import javax.swing.JFrame;

/**
 *
 * @author guilherme
 */
public class PainelTrasnparente extends javax.swing.JPanel {

    private Robot robot;
    private BufferedImage fundo;
    
    public PainelTrasnparente(JFrame pai) {
        initComponents();

        try {
            robot = new Robot();

            setBounds(0,0,pai.getWidth(),pai.getHeight());//faz o painel ficar do tamanho do Frame

            //tira um print screen da tela, de acordo com as coordenadas do retângulo que foi passado como parâmetro
            fundo=robot.createScreenCapture(new Rectangle(pai.getX(),pai.getY(),pai.getWidth(),pai.getHeight()));
            
        } catch (AWTException ex) {}
        
    }

    @Override
    public void paintComponent(Graphics g){
        super.paintComponent(g);
        //sobrescreve o metodo paintComponent para poder tornar o printScreen o fundo do Painel
        g.drawImage(fundo, 0,0, null);
    }

E no JFrame…

/**
 *
 * @author guilherme
 */
public class FramePai extends javax.swing.JFrame {

    public FramePai() {
        setUndecorated(true);//retira a barra de título do JFrame

        initComponents();
        setLocationRelativeTo(null);//faz o frame ser exibido no meio da tela
        
        PainelTrasnparente pt=new PainelTrasnparente(this);//instancia o painel
        
        add(pt);//adiciona ao JFrame
    }

Esse foi o resultado no meu PC:
http://sohminha.orgfree.com/images/JFrameTrasnparente.png

Esse relevo só aconteceu porque meu Ubuntu tem efeito de sombreamento de janelas, mas eu ja testei num XP e que eu me lembre, fica ok! :slight_smile:

Agora, é só adicionar os componentes desejados no JPanel, no teu caso, um JLabel com icone, pra dar o efeito de janela com forma personalizada(pelo que eu entendi).

Nota: o Frame e o painel podem ser criados direto pelo netbeans, não precisa ser na mão, é só editar aqueles trechos e deu…

Espero ter ajudado! :smiley:

Sobre esse construtor --> public PainelTrasnparente(JFrame pai), aqui não compila…
não teria que passar como parâmetro algum atributo da própria classe?

Sim, na verdade, o que deve ser passado é uma referência do JFrame pai (o JFrame que vai conter o painel invisível), como mostra no segundo código.
Assim, ele se molda em tamanho e verifica qual a posição que deve tirar o printscreen.

Ah, não compila?! … Uhm…
Talvez tu tenha copiado esse código e colado em classes vazias, isso?!

É que isso não é o códico completo, isso são os trechos que devem ser modificados numa classe JPanel (primeiro código) e JFrame (segundo código).
Só assim não compila mesmo, hehe :stuck_out_tongue:
Precisa de todo resto da estrutura…

ps: desculpa a demora pra responder… hehe

Espero que ajude! :smiley:

[quote=gco-designer]Sim, na verdade, o que deve ser passado é uma referência do JFrame pai (o JFrame que vai conter o painel invisível), como mostra no segundo código.
Assim, ele se molda em tamanho e verifica qual a posição que deve tirar o printscreen.

Ah, não compila?! … Uhm…
Talvez tu tenha copiado esse código e colado em classes vazias, isso?!

É que isso não é o códico completo, isso são os trechos que devem ser modificados numa classe JPanel (primeiro código) e JFrame (segundo código).
Só assim não compila mesmo, hehe :stuck_out_tongue:
Precisa de todo resto da estrutura…

ps: desculpa a demora pra responder… hehe

Espero que ajude! :smiley: [/quote]

Tem problema não manoo, a faculdade tah me consumindo e não tem me sobrado muito tempo também… mas obrigado pela ajuda, depois eu dou uma olhadinha no código…!

Aproveitando o embalo… eu tenho um jframe, e nele tenho um jdesktoppane… to usando look and feel “nimbus” e o jdesktoppane fica com uma imagem lá que eu gostaria de trocar…
to usando this.setExtendedState(MAXIMIZED_BOTH) para abrir o frame maximizado e queria que a imagem redimensionasse junto ao frame… vc tem ideia de como poderia fazer isso?? ou alguém aqui do fórum é claro…
agradeço desde já…!!

Aee galera, já consegui resolver o problema da imagem… se alguém teve o mesmo problema fala que posto minha solução aqui… vllw

[quote=gco-designer]Sim, na verdade, o que deve ser passado é uma referência do JFrame pai (o JFrame que vai conter o painel invisível), como mostra no segundo código.
Assim, ele se molda em tamanho e verifica qual a posição que deve tirar o printscreen.

Ah, não compila?! … Uhm…
Talvez tu tenha copiado esse código e colado em classes vazias, isso?!

É que isso não é o códico completo, isso são os trechos que devem ser modificados numa classe JPanel (primeiro código) e JFrame (segundo código).
Só assim não compila mesmo, hehe :stuck_out_tongue:
Precisa de todo resto da estrutura…

ps: desculpa a demora pra responder… hehe

Espero que ajude! :smiley: [/quote]

Ae mano… dei uma olhadinha aqui e realmente tinha feito besteira no código, mas apaguei o que eu tinha feito e fiz exatamente igual ao seu aí…

está me voltando a seguinte exceção (Tô usando o netbeans 7.2):

Exception in thread “AWT-EventQueue-0” java.awt.IllegalComponentStateException: The frame is displayable.
at java.awt.Frame.setUndecorated(Frame.java:923)
at testeJPanelTransparente.JFrame.<init>(JFrame.java:8)
at testeJPanelTransparente.JFrame$1.run(JFrame.java:66)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:705)
at java.awt.EventQueue.access$000(EventQueue.java:101)
at java.awt.EventQueue$3.run(EventQueue.java:666)
at java.awt.EventQueue$3.run(EventQueue.java:664)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:675)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

Alguma chance de me ajudar?? rss

Isso ocorreu porque tu pediu pra tirar a decoração do JFrame quando ele já estava sendo exibido…

O JFrame tem que estar como invisível pra ser alterada essa característica…
Pode postar os códigos por favor? :slight_smile:

ps: usa a tag [ code ] pra facilitar :slight_smile:

Foi exatamente isso mano, deu certo… agora o porém é o seguinte… como eu faço para meus botões, campos, etc… não ficarem transparentes também??

Uhm… Que estranho…
Eles ficaram? Não era pra ter acontecido, já que isso não passa de um efeito camaleão. Essa técnica é uma espécie de “falsa transparência”, já que a única coisa que é feita é usar o printscreen do que está atrás da janela como background dela.
Tenta fazer uma JPanel comum, colocar os componentes(se tu usa o NetBeans, pode usar o editor de interface mesmo…) e aplicar essas modificações do Painel e do Frame.

ps: se puder, posta o print do resultado aqui
ps2: não utiliza nada relacionado ao efeito de transparência do AWTUtilities.setWindowOpacity(teuJFrame) , esse sim, deixa tudo transparente mesmo, inclusive os componentes… hehehe :smiley:

Uma ótima literatura para você:
http://fivedots.coe.psu.ac.th/~ad/jg/ch045/index.html

[quote=gco-designer]Uhm… Que estranho…
Eles ficaram? Não era pra ter acontecido, já que isso não passa de um efeito camaleão. Essa técnica é uma espécie de “falsa transparência”, já que a única coisa que é feita é usar o printscreen do que está atrás da janela como background dela.
Tenta fazer uma JPanel comum, colocar os componentes(se tu usa o NetBeans, pode usar o editor de interface mesmo…) e aplicar essas modificações do Painel e do Frame.

ps: se puder, posta o print do resultado aqui
ps2: não utiliza nada relacionado ao efeito de transparência do AWTUtilities.setWindowOpacity(teuJFrame) , esse sim, deixa tudo transparente mesmo, inclusive os componentes… hehehe :smiley: [/quote]

eu excluí jForm e fiz com outro, ficou tudo certo… eu não tinha usado o setWindowOpacity() mas to achando que o form que usei devia estar com alguma opção do editor gráfico do netbeeans marcada…

Ainda quer que poste o código??

[quote=ViniGodoy]Uma ótima literatura para você:
http://fivedots.coe.psu.ac.th/~ad/jg/ch045/index.html[/quote]

Vini, gostaria muito de estudar sobre o assunto mas não sou muito bom em inglês, teria alguma chance de ter algum material em português??

[quote]eu excluí jForm e fiz com outro, ficou tudo certo… eu não tinha usado o
view plaincopy to clipboardprint?

mas to achando que o form que usei devia estar com alguma opção do editor gráfico do netbeeans marcada…

Ainda quer que poste o código??[/quote]

Pode ser, assim fica melhor pra visualizar :slight_smile:

[quote=gco-designer][quote]eu excluí jForm e fiz com outro, ficou tudo certo… eu não tinha usado o
view plaincopy to clipboardprint?

mas to achando que o form que usei devia estar com alguma opção do editor gráfico do netbeeans marcada…

Ainda quer que poste o código??[/quote]

Pode ser, assim fica melhor pra visualizar :)[/quote]

Só ressaltando que agora está funcionando normalmente…

Meu JFrame
public class JFrame extends javax.swing.JFrame {

    public JFrame() {
        setUndecorated(true);//retira a barra de título do JFrame
        
        initComponents();
        
        setLocationRelativeTo(null);
        
        JPanelTransparente pt = new JPanelTransparente(this);
        
        add(pt);//adiciona ao JFrame 
    }

    @SuppressWarnings("unchecked")
    // &lt;editor-fold defaultstate="collapsed" desc="Generated Code"&gt;                          
    private void initComponents() {

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setUndecorated(true);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );

        pack();
    }// &lt;/editor-fold&gt;                        

    public static void main(String args[]) {
        setLookAndFeel();
        java.awt.EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                new JFrame().setVisible(true);
            }
        });
    }
    // Variables declaration - do not modify                     
    // End of variables declaration                   

    private static void setLookAndFeel() {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | javax.swing.UnsupportedLookAndFeelException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }

E meu JPanel

public class JPanelTransparente extends JPanel {
    
    private Robot robot;
    private BufferedImage fundo;

    public JPanelTransparente(JFrame pai) {
        initComponents();
        try {
            robot = new Robot();
            setBounds(0, 0, pai.getWidth(), pai.getHeight());//painel do tamanho do Frame  
            //print da tela, de acordo com as coordenadas do retângulo que foi passado como parâmetro  
            fundo = robot.createScreenCapture(new Rectangle(pai.getX(), pai.getY(), pai.getWidth(), pai.getHeight()));
        } catch (AWTException ex) {
            JOptionPane.showMessageDialog(null, ex);
        }
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        //tornar o printScreen o fundo do Painel
        g.drawImage(fundo, 0, 0, null);
    }
    @SuppressWarnings("unchecked")
    // &lt;editor-fold defaultstate="collapsed" desc="Generated Code"&gt;                          
    private void initComponents() {

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this);
        this.setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 400, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGap(0, 300, Short.MAX_VALUE)
        );
    }// &lt;/editor-fold&gt;                        
    // Variables declaration - do not modify                     
    // End of variables declaration                   
}

Legal! :slight_smile: Fico feliz por ter dado certo :slight_smile:
Agora só tinha que marcar o tópico como “resolvido”…

Abraço cara! :smiley:

[quote=fael.programer][quote=ViniGodoy]Uma ótima literatura para você:
http://fivedots.coe.psu.ac.th/~ad/jg/ch045/index.html[/quote]

Vini, gostaria muito de estudar sobre o assunto mas não sou muito bom em inglês, teria alguma chance de ter algum material em português??[/quote]

Normalmente, não. E é bom você começar a correr atrás. 90% dos bons materiais da área estão em inglês.

[quote=ViniGodoy][quote=fael.programer][quote=ViniGodoy]Uma ótima literatura para você:
http://fivedots.coe.psu.ac.th/~ad/jg/ch045/index.html[/quote]

Vini, gostaria muito de estudar sobre o assunto mas não sou muito bom em inglês, teria alguma chance de ter algum material em português??[/quote]

Normalmente, não. E é bom você começar a correr atrás. 90% dos bons materiais da área estão em inglês.[/quote]

Já deu pra perceber, o problema é o tempo… trabalho pela mnhã em um emprego, a tarde em outro, e a noite faculdade… Cansativo DEMAIS e pouco dinheiro!
Mas vou dar um jeito… Mesmo assim obrigado.

Legal! :slight_smile: Fico feliz por ter dado certo :slight_smile:
Agora só tinha que marcar o tópico como “resolvido”…

Abraço cara! :D[/quote]

É que não foi eu quem abri o tópico, só peguei a carona… Eu que tenho que marcar como resolvido? Sou novo por aqui também…