Download: http://adf.ly/7390380/transparentbackground
Jframe trong suốt như hình bên dưới:
Kỹ thuật ở đây là chụp ảnh màn hình vẽ (paint) vào component.
Đầu tiên tạo 1 lớp TransparentBackground extends JComponent{
private Image background;
Tiếp theo là phương thức updateBackground() dùng để chụp ảnh màn hình
public final 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();
}
}
Một phương thức quan trọng là Override lại paintComponent(Graphics g). Điều này có ý nghĩa là vẽ lại background của component bằng ảnh nền đã chụp bằng phương thức updateBackground() ở trên.
@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);
}
Với hai phương thức trên thì có vẻ như component của chúng ta đã được trong suốt nhờ ảnh nền trùng với ảnh nền của màn hình.
Tuy nhiên vấn đề khi component di chuyển hoặc thay đổi kích thước thì component cần được cập nhật lại ảnh nền (background )
Để làm được như vậy đối tượng TransparentBackground cần implements Runnable, WindowFocusListener, ComponentListener.
Mỗi khi component được resize hoặc di chuyển,.. thì hai phương thức dưới đây sẽ được gọi để cập nhật lại ảnh nền của components
private long lastupdate = 0;
public boolean refreshRequested = true;
public void run() {
try {
while (true) {
Thread.sleep(250);
long now = new Date().getTime();
if (refreshRequested
&& ((now - lastupdate) > 1000)) {
if (frame.isVisible()) {
Point location = frame.getLocation();
frame.hide();
updateBackground();
frame.show();
frame.setLocation(location);
refresh();
}
lastupdate = now;
refreshRequested = false;
}
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public void refresh() {
if (frame.isVisible()) {
repaint();
refreshRequested = true;
lastupdate = new Date().getTime();
}
}
|