Efecto de transparencia en un JFrame
hace un par de dias arregle este codigo, en el cual se da el efeto que mencione, son dos clases, una se de ellas es el JFrame al cual se le desea dar transparencia (Ventana.java) y el otra clase es la que se encarga de recibir este JFrame en su constructor y trabajarla (TransparentBackground.java). En caso de que se quiera dar transparencia a mas frames pueden hacer otra instancia del TransparentBackground, es decir, una instancia por JFrame.. o que ya sea que la retoquen el TransparentBackground para que todas las ventanas usen una misma instancia.
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 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.JComponent;
import javax.swing.JFrame;
/**
*
* @author manix
*/
public class TransparentBackground extends JComponent implements ComponentListener , WindowFocusListener ,Runnable {
private JFrame frame;
protected Image background;
private long lastupdate = 0;
public boolean refreshRequested = true;
public TransparentBackground(JFrame frame) {
this.frame = frame;
updateBackground();
frame.addComponentListener(this);
frame.addWindowFocusListener(this);
new Thread(this).start();
}
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) {
p(ex.toString());
ex.printStackTrace();
}
}
@Override
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);
}
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 void refresh() {
if (this.isVisible() && frame.isVisible()) {
repaint();
refreshRequested = true;
lastupdate = new Date().getTime();
}
}
public static void p(String str) {
System.out.println(str);
}
private boolean recurse = false;
public void quickRefresh() {
}
public void run() {
try {
while(true) {
Thread.sleep(1);
long now = new Date().getTime();
if(refreshRequested &&
((now - lastupdate) > 100000)) {
if(frame.isVisible()) {
Point location = frame.getLocation();
frame.setVisible(false);
updateBackground();
frame.setVisible(true);
frame.setLocation(location);
refresh();
}
lastupdate = now;
refreshRequested = false;
}
}
} catch (Exception ex) {
p(ex.toString());
ex.printStackTrace();
}
}
1
1
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
public class Ventana {
public static void main(String[] args) {
JFrame frame = new JFrame("Efecto de ventana transparente");
TransparentBackground bg = new TransparentBackground(frame);
bg.setLayout(new BorderLayout());
JButton button = new JButton("Esto es un boton");
bg.add("North", button);
JLabel label = new JLabel("Esto es una etiqueta");
bg.add("South", label);
frame.getContentPane().add("Center", bg);
frame.pack();
frame.setSize(300, 300);
frame.setVisible(true);
}
}
Por si alguien tiene interes en este recuerso aca lo comparto
link roto
muy bueno! sip el link esta roto pero se puede armar el objeto con el listado, se crea un efecto de cristal transparente, solo tengo una duda la transparencia es del 100%, se puede hacer de un 25% 80%? si alguien tiene una idea de como hacerlo mi correo es nilk_ao@hotmail.com
salu2s