当前位置: 代码迷 >> Java相关 >> [求助]JFrame背景透明化后留下的问题
  详细解决方案

[求助]JFrame背景透明化后留下的问题

热度:285   发布时间:2007-10-11 18:48:43.0
[求助]JFrame背景透明化后留下的问题

代码如下:
问题:我已经将JFrame背景透明化了,但是打开以后总是遇到阁一段时间就刷新一次的问题,到最后还会一闪一闪的。
很麻烦,请问下有没有能够解决的。

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;
public class JFrameTransparent extends JComponent implements ComponentListener, WindowFocusListener,Runnable
{
JFrame frame;
Image background;
long lastupdate=0;
boolean refreshRequested = true;
public JFrameTransparent(JFrame frame)throws Exception
{
this.frame = frame;
update();
frame.addComponentListener(this);
frame.addWindowFocusListener(this);
new Thread(this).start();
}
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 update()throws Exception
{
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()));
//createScreenCapture用于创建包含从屏幕中读取的像素的图像
}
public void paintComponent(Graphics g)
{
Point pos=this.getLocationOnScreen();
Point offset=new Point(-pos.x,-pos.y);//表示 (x, y) 坐标空间中的位置的点,以整数精度来指定
g.drawImage(background,offset.x,offset.y,null);
}
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();
update();
frame.show();
frame.setLocation(location);
refresh();
}
lastupdate = now;
refreshRequested = false;
}
}
}
catch(Exception ee){
}
}
public void refresh()
{
if(frame.isVisible())
{
repaint();
refreshRequested = true;
lastupdate = new Date().getTime();
}
}
public static void main(String args[])throws Exception
{
JFrame frame=new JFrame("我不告诉你");
JFrameTransparent bg = new JFrameTransparent(frame);
bg.setLayout(new BorderLayout());
JTextArea jtf=new JTextArea("this is a text");
bg.add(jtf,BorderLayout.NORTH);
frame.add(bg);
frame.setSize(250,200);
frame.setVisible(true);
}}

[此贴子已经被作者于2007-10-11 21:09:41编辑过]

搜索更多相关的解决方案: JFrame背景  import  透明化  java  awt  

----------------解决方案--------------------------------------------------------
呵呵,有意思
----------------解决方案--------------------------------------------------------

可能是楼主 的显示器在刷新
我透明之后 就没出现这个问题


----------------解决方案--------------------------------------------------------

我的问题是待透明一段时间后就会不停的刷新界面


----------------解决方案--------------------------------------------------------
刚才把main()函数写错了,现在改好了,不需要再重新弄。不过还是出现了刷新的问题
----------------解决方案--------------------------------------------------------
呵呵,是从<Swing Hacks>那本书上搞的吧?

这个方法确实比较巧妙,不过个人认为实用价值不大.

----------------解决方案--------------------------------------------------------

- -..
我没看过<Swing Hacks>
自己找的例子,然后修改的。


----------------解决方案--------------------------------------------------------
基本可以确定,列子是出自那本书的.

你可以把这个看作一种尝试,了接一下原理就可以了.但真正的应用里面是不太可能有用的.
因为这种解决方式有很多缺陷.

----------------解决方案--------------------------------------------------------