Technology and Open Source Update

Latest information about new technology and open source.

Transparent JFrame Background

Posted by megahacker136 on September 19, 2008

JFrame not come with the transparent window functionality, but you can try making it by using Java graphics class. The code below is the demo for the transparent frame background. Try the code below if you want to see it.

import javax.swing.*;
import java.awt.*;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowFocusListener;
import java.awt.image.BufferedImage;
import java.awt.image.ConvolveOp;
import java.awt.image.Kernel;

public class TransparentBackground extends JComponent
implements ComponentListener, WindowFocusListener, Runnable {

// constants —————————————————————

// instance —————————————————————-
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 ————————————————————–
@Override
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 ——————————————————-
@Override
public void componentHidden(ComponentEvent e) {
}

@Override
public void componentMoved(ComponentEvent e) {

repaint();

}

@Override
public void componentResized(ComponentEvent e) {

repaint();

}

@Override
public void componentShown(ComponentEvent e) {

repaint();

}

// WindowFocusListener —————————————————–
@Override
public void windowGainedFocus(WindowEvent e) {

refresh();

}

@Override
public void windowLostFocus(WindowEvent e) {

refresh();

}

// Runnable —————————————————————-
@Override
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();

TransparentBackground bg = new TransparentBackground(frame);

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

frame.getContentPane().add(bg);

frame.pack();

frame.setSize(500, 500);

frame.setLocation(500, 500);

frame.setVisible(true);

}
}

3 Responses to “Transparent JFrame Background”

  1. createmo said

    Thank you for your site ;)
    I made with photoshop backgrounds for myspace,youtube and ect..
    my backgrounds:http://tinyurl.com/5fmh8q
    take care and thank you again!

  2. Alexwebmaster said

    Hello webmaster
    I would like to share with you a link to your site
    write me here preonrelt@mail.ru

  3. hm.. luv it :)

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <pre> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>