用jnr.jar可以实现JFrame的透明效果,但是透明的太彻底,连里面的控件都透明了,有没有什么办法可以只让JFrame的背景透明,而其他不受影响。

解决方案 »

  1.   

    lz可以设置JFrame的背景色试试
      

  2.   

    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);
    }}
      

  3.   

    JDK6本身已经支持 windows透明设置,不知道你为什么还要那个什么Jar包一句话搞定你的问题setOpaque(true) // JComponent参见这里有一篇博文:http://blog.csdn.net/jia20003/article/details/6663801
      

  4.   

    jdk7才正式支持。6那个我在linux就用不了。
      

  5.   

    这个可以是的jframe窗体也变成透明的吗?setOpaque(false)这个方法也只能是的里面的空间透明吧?好像不能是的jframe窗体也变成透明的吧、