Sobrepor Icones (Colocar um sobre o outro) [RESOLVIDO]

Seguinte,

Tenho uma aplicação swing onde há uma barra de ferramentas (JToollbar), nessa barra de ferramentas há diversos JButton, cada um com seu icone.

Todos os icones sao no formato PNG, porem, agora eu preciso criar uma funcao que Proibe o acesso ao Botao, fiz o seguinte:


    //funcao para dar a mensagem de BLOQUEADO
    public void setAlertaModuloBloqueado(JButton botao, Modulos modulo) {
        for (ActionListener listener : botao.getActionListeners()) {
            botao.removeActionListener(listener);
        }

        ImageIcon iconeAtual = botao.getIcon();
        ImageIcon iconeX = new ImageIcon("X.png"));

        ///AQUI O PROBLEMA, COMO MESCLAR OS DOIS ICONES, SENDO QUE O iconeAtual vai ser o fundo e o X sobreposto
        novoIcone = ????????;

        botao.setIcon(novoIcone);

        botao.addActionListener(new ModuloBloqueadoActionListener(modulo, this));
    }

A classe ModuloBloqueadoActionListener simplesmente da a mensagem “O modulo ‘xpto’ esta bloqueado”

Porem, eu gostaria de colocar um X veremelho sobre o icone que se encontra ja setado dentro do botao, tipo, vou gerar o X.png, entao eu deveria carrega-lo em memoria e mesclar com o icone do botao e dar um setIcon no botao para o novo icone gerado em runtime, alguem pode me ajudar a mescar as duas imagens?

Vejam que o meu problema é apenas sobrepor esse X sobre o icone que ja existe no botao.

Obrigado!

Não é por nada não, mas se você tem até 50 ícones, é mais fácil você pegar o seu editor gráfico preferido, e criar outros 50 ícones com esse X sobre eles. É meio braçal mas acho que dá menos problemas.

Bom… vc quer colocar o X para dizer q n pode clicar, algo assim!

Pq n faz assim:

Gera a imagem mesclada com seu editor de imagens!
Substitui a imageicon no seu botão, com

Se forem muitas imagens concordo q complica… mas acredito q eh a forma mais fácil!

A propósito… talvez isso t ajude:
http://www.google.com.br/search?q=double+buffered+image+java

[quote=tkx]Bom… vc quer colocar o X para dizer q n pode clicar, algo assim!

Pq n faz assim:

Gera a imagem mesclada com seu editor de imagens!
Substitui a imageicon no seu botão, com

Se forem muitas imagens concordo q complica… mas acredito q eh a forma mais fácil![/quote]

Nao tem jeito, pq ai eu teria que criar 50 funcoes iguais a essa, uma pra cada icone, e sempre que adicionar um novo item mais funcao… mais icone…

Sem chance!

E vejam que a funcao recebe o JButton como parametro, entao eu sequer sei qual Jbutton é e qual icone esta nele!

Por isso tenho que fazer desta forma.

sobreescreva o paintComponent do seu JButton…

assim :


public void paintComponent(Graphics g){
   super.paintComponent(g);
   if (isDisabled){
      g.drawImage(seuIconeX,0,0,seuIconeX.width,seuIconeX.height);
   }
}

[quote=dyorgio]sobreescreva o paintComponent do seu JButton…

assim :

[code]

public void paintComponent(Graphics g){
super.paintComponent(g);
if (isDisabled){
g.drawImage(seuIconeX,0,0,seuIconeX.width,seuIconeX.height);
}
}

[/code][/quote]

Mas o botao nao vai ficar disabled!!!

Se analisarem o codigo da funcao la em cima, vao ver que removo todo os actionlisteners do botao e depois adiciono 1 que da uma mensagem de modulo bloqueado, portanto. Outra coisa, eu NAO SEI qual o icone que esta no botao, so quero adiconar um X sobre o icone que estiver la.

[]s

Kemper

Cara, isDisabled e seuIconeX são variaveis inventadas por mim…
apenas para ilustrar o conceito,
analize o codigo que te passei que é o que vc precisa.

extenda JButton e use essa extensão para a sua toolbar, ex:

public class BotaoDaBarra extends JButton {

private boolean toMarkX = false;

Image seuIconeX = IOImage.read("suaImagemDoX")

   public  void paintComponent(Graphics g){  
   super.paintComponent(g);  
   if (toMarkX){  
      g.drawImage(seuIconeX,0,0,seuIconeX.width,seuIconeX.height);  
   }  
} 

public void setToMarkX(boolean toMarkX ){
this.toMarkX = toMarkX;
}
}

ai sempre que tu quiser pintar de maneira diferenciada(com o X, no caso)
basta setar setToMarkX(true);

em qualquer botão desse tipo.

Resolvido,

Vejam como ficou a funcao:

A variavel iconeX esta definida na classe para nao precisar instanciar toda vez…

private Image iconeX = new ImageIcon(getClass().getResource("/br/com/omegacodigos/ultra/swing/icones/icone-modulo-bloqueado.png")).getImage();
    public void setAlertaModuloBloqueado(JButton botao, Modulos modulo) {
        for (ActionListener listener : botao.getActionListeners()) {
            botao.removeActionListener(listener);
        }

        
        //COLOCA UM X SOBRE O ICONE QUE ESTIVER NO BOTAO
        Image iconeAtual = ((ImageIcon) botao.getIcon()).getImage();
        BufferedImage img = new BufferedImage(botao.getIcon().getIconWidth(), botao.getIcon().getIconHeight(), BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = (Graphics2D) img.getGraphics();
        g.drawImage(iconeAtual, null, null);
        g.drawImage(iconeX, 8, 8, null);
        ImageIcon icone = new ImageIcon(img);
        botao.setIcon(icone);
        
        //EXIBE MENSAGEM DE MODULO BLOQUEADO
        botao.addActionListener(new ModuloBloqueadoActionListener(modulo, this));

    }