想做一个类似QQ收到公告消息时弹出窗口的效果一样,窗口的背景色会渐渐变淡,直道消失为止。请问这个效果用Swing能做到吗?怎么做啊?

解决方案 »

  1.   

    第一:要求是背景渐渐变浅,所以这个间隔时间要设置成多少呢?10毫秒改变一次么?
    —— 应给根据你的需求而定,如果你打算 5秒内完成变色,每次改变 10% 的亮度;
    —— 那么就是 5s÷10 = 500ms第二:背景颜色怎么控制,比如一开始窗口弹出时是红色的,然胡每次改变颜色时这个颜色要怎么设置呢?比如我怎么知道比红色再浅一点的颜色是什么颜色?然后比这个颜色再浅一点的是什么颜色呢?
    —— 预先设置好初始色 和 结束色,然后每次取出其RGB值进行计算,无非就是:
    —— red = beginRed(初始红色) + times(迭代次数) * (endRed - beginRed) / total(总次数);
      

  2.   

    ldh911大哥,还有一个问题,有没有什么窗口,是不带蓝颜色标题栏的,只有一个窗口体。
      

  3.   


    JFrame.setDefaultLookAndFeelDecorated(false);
      

  4.   

    这句试了,好像没有效果啊:
    public static void main(String args[]){
        JFrame.setDefaultLookAndFeelDecorated(false);
        JFrame jf = new JFrame();
        jf.setSize(200,200);
        jf.getContentPane().setBackground(Color.grey);
        jf.setVisible(true);
    }
    弹出来的窗体还是带蓝色的边框。
      

  5.   

    不好意思,弄错了:
      this.setUndecorated(true); 
      

  6.   

    java7就可以实现
     public void paint(Graphics g, JComponent c) {
        super.paint(g, c);     Graphics2D g2 = (Graphics2D) g.create();     int w = c.getWidth();
        int h = c.getHeight();
        g2.setComposite(AlphaComposite.getInstance(
                AlphaComposite.SRC_ATOP, .5f));
        g2.setPaint(new GradientPaint(12, 12, Color.yellow, 12, h, Color.red));
        g2.fillRect(0, 0, w, h);     g2.dispose();
      }
      

  7.   

    ldh911大哥,这个方法没看明白,能不能详解一下?
    有什么方法可以直接拿到当前Frame的透明度,然后直接定时改变透明度,一直到全透明,不知这条路可行不?
      

  8.   

    你主贴说的是变色,现在要求是透明,这个难度可是不一样啊。给你段代码参考吧:import javax.swing.*;
    import com.sun.awt.AWTUtilities;public class JFrameFadeOut extends JFrame {
        public JFrameFadeOut() {
            this.setSize(400, 300);
            this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        }
        public static void main(String[] args) {
            JFrameFadeOut wnd = new JFrameFadeOut();
            wnd.setVisible(true);
            new FadeOut(wnd).start();
        }
        static class FadeOut extends Thread {
            private JFrameFadeOut wnd;
            public FadeOut(JFrameFadeOut wnd) {
                this.wnd = wnd;
            }
            public void run() {
                try {
                    for (int i = 100; i > 0; i--) {
                        Thread.sleep(100);
                        AWTUtilities.setWindowOpacity(wnd, i / 100f);
                    }
                } catch (Exception ex) {
                    ex.printStackTrace();
                }
                wnd.setVisible(false);
            }
        }
    }另一种做法是,启动之前先截图,然后利用重绘桌面截图来实现 透明 效果。
      

  9.   

    在我这边执行会抛异常,IlltegalComponentStateExceptioin 是在AWTUtilities.setWindowOpacity(wnd, i / 100f);这句抛出的。
    更改透明度是不是只有用AWTUtilities这一种方式呢?
      

  10.   

    直接更改透明度,基本上只有 AWTUtilities 的方式。
    我这边测试是正常的,我是 JDK1.6。另外还有中方式就是用Eclipse的SWT的图形界面,但就完全不是Swing这套了。
      

  11.   

    窗口渐淡这种效果,貌似要使用操作系统特定的API,在J2SE1.4, 1.5是不支持的。
    AWTUtilities 这个类在com.sun.awt包中,官方不保证其向后兼容,不保证跨平台性,不保证稳定性.
    J2SE 1.7 中透明效果已经被 Frame 的 setOpacity 方法代替,应该已经跨平台了.