Como criar uma janela(JFrame) "intocável"?

8 respostas
gco-designer

Oi gente, meu problema é o seguinte, eu tava querendo criar uma janela que fosse apenas visível, mas que todos os eventos fossem capturados no componente de trás…
Eu sei, tá uma enrolaçada, mas é esse o pior problema: Eu não sei o que pesquisar pra encontrar isso.

Um exemplo pratico são aquelas notificações do Ubuntu:
http://sohminha.orgfree.com/images/Captura_de_tela.png
http://sohminha.orgfree.com/images/Captura_de_tela-1.png
http://sohminha.orgfree.com/images/Captura_de_tela-2.png

Como nos prints acima, mesmo com a notificação na frente, eu selecionei o texto na barra de endereço…
Será que tem como fazer isso no Java?

Desde já, agradecido… :slight_smile:

8 Respostas

JhowTroMundo

Pode começar por aqui. Talvez te ajude.
http://www.guj.com.br/java/37746-nao-exibir-as-bordas-e-barra-de-titulo-de-um-frame

gco-designer

Vlw a dica cara!
Tipo, pra fazer a janela, a transparência, ou as bordas, tudo bem, mas o problema mesmo é tirar essa “solides”, ou seja, dizer pro mouse que ela não exite…
Mas valeu mesmo a dica cara! :smiley:

JhowTroMundo

Nao sei exatamente o que vc quis dizer com “tirar essa sodides”, mas pode tirar a habilidade do frame de ser focável (setFocusable(false)), ou procurar outra propriedade que o valha. Nunca fiz nada do tipo, mas parece interessante.

gco-designer

É assim, o que eu quero fazer é uma espécie de “holograma”.
Uma janela que seja exibida, mas que não seja “sentida”, de forma que o mouse quando clique encima dela, acabe clicando no que tá atrás dela, como na terceira imagem, onde eu selecionei o texto, mesmo com aquela pop-up na frente… entende?
Uma notificação que não atrapalhe na tela…

JhowTroMundo

Ahhhh… Boa sorte!
Quanto tiver a solução posta ai, pq eu nao faço ideia kkk

gco-designer

Pode dexar! :slight_smile:

dudaskank

Veja se isso ajuda:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;


public class TesteOverlay {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		new TesteOverlay().teste();
	}

	private void teste() {
		JFrame frame = new JFrame("Overlay");
		JButton botao = new JButton("Teste");
		frame.add(botao);
		frame.setSize(640, 480);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		frame.setVisible(true);
		frame.setGlassPane(new Overlay());
		botao.setAction(new ShowOverlay());
	}

	class ShowOverlay extends AbstractAction {
		private static final long serialVersionUID = 1817243571776498418L;

		public ShowOverlay() {
			putValue(NAME, "Teste");
		}
		
		@Override
		public void actionPerformed(ActionEvent e) {
			JButton botao = (JButton) e.getSource();
			JFrame theFrame = (JFrame) botao.getTopLevelAncestor();
			Overlay overlay = (Overlay) theFrame.getGlassPane();
			overlay.mostra("Apertou", 1);
		}
		
	}
	
	class Overlay extends JComponent implements Runnable {
		private static final long serialVersionUID = 8906385904245788553L;

		String texto = "";
		Long fim = 0L;
		Thread thread;
		
		public void mostra(String string, int i) {
			texto = string;
			synchronized (fim) {
				fim = System.currentTimeMillis() + (i * 1000);
			}
			setVisible(true);
			if (thread == null) {
				thread = new Thread(this);
				thread.start();
			}
		}
		
	    public void paint(Graphics g) {
	        g.setColor(Color.red);
	        g.drawString(texto, 10, 20);
	    }

		@Override
		public void run() {
			synchronized (fim) {
				while(System.currentTimeMillis() < fim) {
					Thread.yield();
				}
				setVisible(false);
				thread = null;
			}
		}
	}
}
gco-designer

Isso vai me servir pra outro projeto, mas nesse caso, o que eu procuro é fazer uma janela “fantasma”, um holograma, onde eu clico nela e o mouse clique no que esta atrás, como se ela não estivesse ali.
Mas vlw pela ajuda cara! Isso vai me servir pra uma notificação que eu tava precisando fazer!
Valeu!

Criado 19 de dezembro de 2011
Ultima resposta 22 de dez. de 2011
Respostas 8
Participantes 3