Re:Aplicação com Tela em formato circular

8 respostas
hvidal

É possivel sim.

Tem um artigo completo sobre isso aqui:
http://www.onjava.com/pub/a/onjava/excerpt/swinghks_hack41/index.html

Esse é um artigo extraído do livro Swing Hacks, escrito por Joshua Marinacci e Chris Adamson.

Grande abraço,
Hugo.

8 Respostas

dudaskank

Bem, sobre esse snapBackground, se tá funcionando sem devem ter colocado e esquecido de tirar antes mesmo

Sobre a forma da imagem, é só colocar lá um JLabel com ela no meio do form e pronto, lembrando que a imagem deve ter o fundo transparente. Ou ainda criando um componente para desenhar ela no fundo, tipo um JPanel, para poder colocar uns botões em cima e tal…

flw

rodrigo1

Dá uma olhada nesse código ...

Obs: as duas imagens que vc postou, nenhum tá com fundo trasparente

import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import javax.swing.JComponent;

public class TransparentBackground extends JComponent{
	private Image background;

	public TransparentBackground() {
		updateBackground();
	}

	public void updateBackground() {		
		try {
			Robot rbt = new Robot();
			Toolkit tk = Toolkit.getDefaultToolkit();
			Dimension dim = tk.getScreenSize();
			background = rbt.createScreenCapture(new Rectangle(0, 0, (int) dim
					.getWidth(), (int) dim.getHeight()));
		} catch (Exception ex) {
			ex.printStackTrace();
		}	
	}

	public void paintComponent(Graphics g) {
		Point pos = this.getLocationOnScreen();
		Point offset = new Point(-pos.x, -pos.y);
		g.drawImage(background, offset.x, offset.y, null);
	}
}
import java.awt.BorderLayout;
import java.awt.Point;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.util.Date;
import javax.swing.ImageIcon;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JLabel;
 
public class MyFrame extends JFrame implements  
		ComponentListener,WindowFocusListener,Runnable  {
	
	private TransparentBackground transpPanel = null;
    private boolean refreshRequested = true;
    private long lastupdate = 0;


	public MyFrame() {
		setUndecorated(true);
		setSize(500, 500);
		setLocation(20, 20);	    
		getContentPane().add(getPanelComponents());
		addComponentListener(this);
		addWindowFocusListener(this);
		new Thread(this).start( );
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
	}

	private JComponent getPanelComponents() {
				
		transpPanel = new TransparentBackground();
		BorderLayout layout = new BorderLayout();
		transpPanel.setLayout(layout);
		
		ImageIcon icon = createImageIcon("BOLA-NIKE.jpg",
        "imagem mascote java");
		
		JLabel label = new JLabel(icon);
		transpPanel.add(label);;
	    	
		return transpPanel;
	}

			
    /** Returns an ImageIcon, or null if the path was invalid. */
    protected static ImageIcon createImageIcon(String path,
                                               String description) {
        java.net.URL imgURL = MyFrame.class.getResource(path);
        if (imgURL != null) {
            return new ImageIcon(imgURL, description);
        } else {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }
    
    public void refresh( ) {
        if(isVisible( )) {
            repaint( );
            refreshRequested = true;
            lastupdate = new Date( ).getTime( );
        }
    }
    public void run( ) {
        try {
            while(true) {
                Thread.sleep(1);
                long now = new Date( ).getTime( );
                if(refreshRequested &&
                    ((now - lastupdate) > 1000)) {
                    if(isVisible( )) {
                        Point location = getLocation( );
                        setVisible(false);
                        transpPanel.updateBackground( );
                        setVisible(true);
                        setLocation(location);
                        refresh( );
                    }
                    lastupdate = now;
                    refreshRequested = false;
                    }
                }
            } catch (Exception ex) {
                ex.printStackTrace( );
            } 
        }
    
    public void componentShown(ComponentEvent evt) { repaint( ); }
    public void componentResized(ComponentEvent evt) { repaint( ); }
    public void componentMoved(ComponentEvent evt) { repaint( ); }
    public void componentHidden(ComponentEvent evt) { }

    public void windowGainedFocus(WindowEvent evt) { refresh( ); }    
    public void windowLostFocus(WindowEvent evt) { refresh( ); }
    
     
    public static void main(String[] args){
    	MyFrame fr = new MyFrame();
	}
}
andrepestana

Ghostt,

poderia me passar a sua solução para este problema?

Valeu!

paulogto

Pessoal,

É possivel criar uma aplicação que ela possua uma imagem de fundo, por exemplo, uma foto de uma bola, onde apenas a bola apareça, onde a imagem possue area transparente ao seu redor, e a aplicação possua o formato da bola (formato circular), deixando de mostra a área transparente?
É possivel isso?

Obrigado pela atenção!

paulogto

Valeu Hugo!

Vou dar uma olhada no site e ver o que consigo resolver!

Obrigado!
Aquele abraço!

paulogto
Entrei no site, fiz alguns testes, mas quando fui alterar a parte:
public static void main(String[] args) {
    JFrame frame = new JFrame("Transparent Window");
    frame.setUndecorated(true);
    
    TransparentBackground bg = new TransparentBackground(frame);
    bg.snapBackground( );
    bg.setLayout(new BorderLayout( ));

   JPanel panel = new JPanel( ) {
        public void paintComponent(Graphics g) { 
            g.setColor(Color.blue);
            Image img = new ImageIcon("mp3.png").getImage( ); 
            g.drawImage(img,0,0,null);
        }
    };
    panel.setOpaque(false);

    bg.add("Center",panel);

    frame.getContentPane( ).add("Center",bg);
    frame.pack( );
    frame.setSize(200,200);
    frame.setLocation(500,500);
    frame.show( );
}
Ocorreu um erro em:
bg.snapBackground( );
Dizendo que não encontrava este método, de fato, ele não existe no codigo... Inserir esta linha pq tenho necessidade de utilizar uma imagem, para usar o trecho acima desabilitei o:
//bg.snapBackground( );
Mas ai não funcionou corretamente. Segue abaixo o codigo completo:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;

public class TransparentBackground extends JComponent

		implements ComponentListener, WindowFocusListener, Runnable 
{
	private JFrame _frame;
	private BufferedImage _background;
	private long _lastUpdate = 0;
	private boolean _refreshRequested = true;
	private Robot _robot;
	private Rectangle _screenRect;
	private ConvolveOp _blurOp;

	// constructor -------------------------------------------------------------
	public TransparentBackground(JFrame frame) 
	{
		_frame = frame;
		try 
		{
			_robot = new Robot();

		}
		catch (AWTException e) 
		{
			e.printStackTrace();
			return;

		}

		Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();

		_screenRect = new Rectangle(dim.width, dim.height);

		float[] my_kernel = 
		{
				0.10f, 0.10f, 0.10f,
				0.10f, 0.20f, 0.10f,
				0.10f, 0.10f, 0.10f};

		_blurOp = new ConvolveOp(new Kernel(3, 3, my_kernel));

		updateBackground();

		_frame.addComponentListener(this);
		_frame.addWindowFocusListener(this);

		new Thread(this).start();

	}

	// protected ---------------------------------------------------------------
	protected void updateBackground() 
	{
		_background = _robot.createScreenCapture(_screenRect);
	}

	protected void refresh() 
	{
		if (_frame.isVisible() && this.isVisible()) 
		{
			repaint();
			_refreshRequested = true;
			_lastUpdate = System.currentTimeMillis();
		}
	}

	// JComponent --------------------------------------------------------------
	protected void paintComponent(Graphics g) 
	{
		Graphics2D g2 = (Graphics2D) g;
		Point pos = this.getLocationOnScreen();
		BufferedImage buf = new BufferedImage(getWidth(), getHeight(), BufferedImage.TYPE_INT_RGB);
		buf.getGraphics().drawImage(_background, -pos.x, -pos.y, null);

		Image img = _blurOp.filter(buf, null);
		g2.drawImage(img, 0, 0, null);
		g2.setColor(new Color(255, 255, 255, 192));
		g2.fillRect(0, 0, getWidth(), getHeight());
	}

	// ComponentListener -------------------------------------------------------
	public void componentHidden(ComponentEvent e) {	}
	public void componentMoved(ComponentEvent e) 
	{
		repaint();
	}

	public void componentResized(ComponentEvent e) 
	{
		repaint();
	}

	public void componentShown(ComponentEvent e) 
	{
		repaint();
	}

	// WindowFocusListener -----------------------------------------------------
	public void windowGainedFocus(WindowEvent e) 
	{
		refresh();
	}

	public void windowLostFocus(WindowEvent e) 
	{
		refresh();
	}

	// Runnable ----------------------------------------------------------------
	public void run() 
	{
		try 
		{
			while (true) 
			{
				Thread.sleep(100);
				long now = System.currentTimeMillis();
				if (_refreshRequested && ((now - _lastUpdate) > 1000)) 
				{
					if (_frame.isVisible()) 
					{
						Point location = _frame.getLocation();
						_frame.setLocation(-_frame.getWidth(), -_frame.getHeight());
						updateBackground();
						_frame.setLocation(location);
						refresh();
					}
					_lastUpdate = now;
					_refreshRequested = false;
				}
			}
		}
		catch (InterruptedException e) 
		{
			e.printStackTrace();
		}
	}
	public static void main(String[] args) 
	{
		JFrame frame = new JFrame("Transparent Window");
	    frame.setUndecorated(true);
	    
	    TransparentBackground bg = new TransparentBackground(frame);
	    //bg.snapBackground( );
	    bg.setLayout(new BorderLayout( ));
	
		JPanel panel = new JPanel( ) 
		{
		    public void paintComponent(Graphics g) 
		    { 
		        g.setColor(Color.blue);
		        Image img = new ImageIcon("duke.png").getImage( ); 
		        g.drawImage(img,0,0,null);
		    }
		};
	    panel.setOpaque(false);
	    bg.add("Center",panel);
	    frame.getContentPane( ).add("Center",bg);
	    frame.pack( );
	    frame.setSize(200,200);
	    frame.setLocation(500,500);
	    frame.show( );
	}

}
Como eu resolvo este problema? Primeiro fazer o form ficar com o formato da imagem e segundo, a falta de codigo... Qual será o processo realizado dentro do
snapBackground( );
:?:
paulogto

Valeu Eduardo!!!

Sua dica foi muito importante no processo!!!

Obrigado :!: :thumbup:

paulogto

Valeu Rodrigo!

De tanto procurar na net acabei achando um código onde demonstrava corretamente a transparencia.
Também utilizei o seu código!

Obrigado a todos pela ajuda :!: :thumbup:

Criado 12 de setembro de 2006
Ultima resposta 13 de set. de 2006
Respostas 8
Participantes 5