JFrame Transparente e JPanel normal

21 respostas
G

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.

21 Respostas

H

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.

G

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:

F

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?

G

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:

F

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:

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á…!!

F

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

F

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:

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

G

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:

F

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??

G

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:

V

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

F

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:

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??

F

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

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??

G

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??

Pode ser, assim fica melhor pra visualizar :slight_smile:

F

gco-designer:
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??

Pode ser, assim fica melhor pra visualizar :)

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                   
}
G

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:

V

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

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??

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

F

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

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??

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

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.

F

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

É 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…

G

Hehe, verdade, nem percebi :stuck_out_tongue:
Tomara que o criador do tópico apareça… hehe
De qualquer maneira, serviço feito :smiley:

A

Eu uso:

setUndecorated(true);
setBackground(new Color(0f, 0f, 0f, 0f));
Criado 15 de dezembro de 2011
Ultima resposta 24 de nov. de 2012
Respostas 21
Participantes 6