RT~请教下真正的透明窗口~不是那种获取屏幕图片来以假乱真的~~不规则形状的也可以~

解决方案 »

  1.   

     哥们也在等呢…好像没人回答这个问题的,我也好奇透明窗口是怎么做的呢…………期待……有答案了发[email protected]
      

  2.   

    抄来一份。
    //package com.flyingwind.tutorial;import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.GradientPaint;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GraphicsConfiguration;
    import java.awt.GraphicsDevice;
    import java.awt.GraphicsEnvironment;
    import java.awt.Paint;
    import java.awt.Shape;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.ComponentAdapter;
    import java.awt.event.ComponentEvent;
    import java.awt.event.ComponentListener;
    import java.awt.geom.Ellipse2D;
    import java.awt.geom.RoundRectangle2D;import javax.swing.ButtonGroup;
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    import javax.swing.JSlider;
    import javax.swing.SpringLayout;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;import com.sun.awt.AWTUtilities;public class TranslucentWindow extends JFrame{
     
     private SpringLayout springLayout_1;
     private ButtonGroup buttonGroup = new ButtonGroup();
     /**
      * 
      */
     private static final long serialVersionUID = 1L;
     private boolean isShapingSupported;
     private boolean isOpacityControlSupported;
     private boolean isTranslucencySupported;
     private GraphicsConfiguration translucencyCapableGC;
     private ComponentListener shapeListener = null;
     
     TranslucentWindow frame = this;
     private JRadioButton roundedRectangle;
     private JRadioButton Oval;
     private JCheckBox paintGradiCheckBox;
     private JPanel panel;
     
     //@SuppressWarnings("serial")
     public TranslucentWindow(){
      
      translucencyCapableGC = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration();
            
      isShapingSupported = AWTUtilities.isTranslucencySupported(AWTUtilities.Translucency.PERPIXEL_TRANSPARENT);
            isOpacityControlSupported = AWTUtilities.isTranslucencySupported(AWTUtilities.Translucency.TRANSLUCENT);
            isTranslucencySupported = AWTUtilities.isTranslucencySupported(AWTUtilities.Translucency.PERPIXEL_TRANSLUCENT);        if(AWTUtilities.isTranslucencyCapable(translucencyCapableGC)){
             translucencyCapableGC = null;
             GraphicsEnvironment env =
                    GraphicsEnvironment.getLocalGraphicsEnvironment();
             GraphicsDevice[] devices = env.getScreenDevices();
     
             for (int i = 0; i < devices.length && translucencyCapableGC == null; i++) {
                 GraphicsConfiguration[] configs = devices[i].getConfigurations();
                 for (int j = 0; j < configs.length && translucencyCapableGC == null; j++) {
                     if (AWTUtilities.isTranslucencyCapable(configs[j])) {
                         translucencyCapableGC = configs[j];
                     }
                 }
             }
             if (translucencyCapableGC == null) {
                 isTranslucencySupported = false;
             }
            }
      setSize(new Dimension(500, 400));
      getContentPane().setLayout(new BorderLayout());  panel = new JPanel(){
        protected void paintComponent(Graphics g) {
         if (g instanceof Graphics2D && paintGradiCheckBox.isSelected()) {
                   final int R = 255;
                   final int G = 0;
                   final int B = 0;
                   Paint p =
                   new GradientPaint(0.0f, 0.0f, new Color(R, G, B, 0),
                       getWidth(), getHeight(), new Color(R, G, B, 255), true);
                   Graphics2D g2d = (Graphics2D)g;
                   g2d.setPaint(p);
                   g2d.fillRect(0, 0, getWidth(), getHeight());
               } else {
                   super.paintComponent(g);
               }
           }
      };
      springLayout_1 = new SpringLayout();
      panel.setLayout(springLayout_1);
      getContentPane().add(panel);
      setUndecorated(true);  final JButton closeButton = new JButton();
      panel.add(closeButton);
      springLayout_1.putConstraint(SpringLayout.EAST, closeButton, 270, SpringLayout.WEST, panel);
      closeButton.addActionListener(new ActionListener() {
       public void actionPerformed(final ActionEvent e) {
        System.exit(0);
       }
      });
      closeButton.setText("Close");  Oval = new JRadioButton();
      panel.add(Oval);
      Oval.setSelected(true);
      Oval.addActionListener(new ActionListener() {
       public void actionPerformed(final ActionEvent e) {
        applyShape();
       }
      });
      buttonGroup.add(Oval);
      Oval.setText("Oval");
      
      
      
      Oval.setEnabled(isShapingSupported);  roundedRectangle = new JRadioButton();
      panel.add(roundedRectangle);
      springLayout_1.putConstraint(SpringLayout.NORTH, roundedRectangle, 170, SpringLayout.NORTH, panel);
      springLayout_1.putConstraint(SpringLayout.WEST, roundedRectangle, 180, SpringLayout.WEST, panel);
      springLayout_1.putConstraint(SpringLayout.EAST, Oval, 230, SpringLayout.WEST, panel);
      springLayout_1.putConstraint(SpringLayout.WEST, Oval, 0, SpringLayout.WEST, roundedRectangle);
      roundedRectangle.addActionListener(new ActionListener() {
       public void actionPerformed(final ActionEvent e) {
        applyShape();
       }
      });
      buttonGroup.add(roundedRectangle);
      roundedRectangle.setText("Rounded rectangle ");
      roundedRectangle.setEnabled(isShapingSupported);  final JSlider slider = new JSlider();
      slider.setPaintLabels(true);
      panel.add(slider);
      springLayout_1.putConstraint(SpringLayout.SOUTH, closeButton, 28, SpringLayout.SOUTH, slider);
      springLayout_1.putConstraint(SpringLayout.NORTH, closeButton, 0, SpringLayout.SOUTH, slider);
      springLayout_1.putConstraint(SpringLayout.EAST, slider, 345, SpringLayout.WEST, panel);
      springLayout_1.putConstraint(SpringLayout.SOUTH, slider, 227, SpringLayout.NORTH, panel);
      springLayout_1.putConstraint(SpringLayout.NORTH, slider, 200, SpringLayout.NORTH, panel);
      slider.setValue(85);
      slider.addChangeListener(new ChangeListener() {
       public void stateChanged(final ChangeEvent e) {
        applyOpacity(((JSlider)e.getSource()).getValue());
       }
      });
      slider.setMinimum(5);  paintGradiCheckBox = new JCheckBox();
      paintGradiCheckBox.setSelected(true);
      panel.add(paintGradiCheckBox);
      springLayout_1.putConstraint(SpringLayout.SOUTH, Oval, 26, SpringLayout.SOUTH, paintGradiCheckBox);
      springLayout_1.putConstraint(SpringLayout.NORTH, Oval, 0, SpringLayout.SOUTH, paintGradiCheckBox);
      springLayout_1.putConstraint(SpringLayout.SOUTH, paintGradiCheckBox, 145, SpringLayout.NORTH, panel);
      springLayout_1.putConstraint(SpringLayout.EAST, paintGradiCheckBox, 285, SpringLayout.WEST, panel);
      springLayout_1.putConstraint(SpringLayout.WEST, paintGradiCheckBox, 0, SpringLayout.WEST, Oval);
      paintGradiCheckBox.setText("Paint gradient");
      paintGradiCheckBox.setEnabled(isTranslucencySupported);  center();
     }  private synchronized void applyOpacity(int value) {
             if (!isOpacityControlSupported) {
                 return;
             }
             panel.updateUI(); 
             AWTUtilities.setWindowOpacity(frame, ((float) value) / 100.0f);
            
      }
      private synchronized void applyShape() {
             if (!isShapingSupported) {
                 return;
             }
             if (shapeListener != null) {
                 shapeListener.componentResized(null);
                 return;
             }
             panel.updateUI();
             final TranslucentWindow fd = frame;
             fd.addComponentListener(shapeListener = new ComponentAdapter() {
    //             @Override
                 public void componentResized(ComponentEvent evt) {
                     Shape shape = null;                 if (roundedRectangle.isSelected()) {
                         shape = new RoundRectangle2D.Float(0, 0, fd.getWidth(), fd.getHeight(), 100, 100);
                         
                     } else if (Oval.isSelected()) {
                         shape = new Ellipse2D.Float(0, 0, fd.getWidth(), fd.getHeight());
                     }
                     AWTUtilities.setWindowShape(fd, shape);
                 }
             });
             
         }
     
      public void center(){
      Dimension d  = Toolkit.getDefaultToolkit().getScreenSize();
      frame.setLocation((d.width-frame.getWidth())/2, (d.height-frame.getHeight())/2);
      }
     public static void main(String args[]){
      new TranslucentWindow().setVisible(true);
     }
    }
     
      

  3.   

    来自http://colorfuldiary.blog.163.com/
      

  4.   

    com.sun.awt.AWTUtilities 类是关键。
      

  5.   


    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.GradientPaint;
    import java.awt.Graphics;
    import java.awt.Graphics2D;
    import java.awt.GraphicsConfiguration;
    import java.awt.GraphicsDevice;
    import java.awt.GraphicsEnvironment;
    import java.awt.Paint;
    import java.awt.Shape;
    import java.awt.Toolkit;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.ComponentAdapter;
    import java.awt.event.ComponentEvent;
    import java.awt.event.ComponentListener;
    import java.awt.geom.Ellipse2D;
    import java.awt.geom.RoundRectangle2D;import javax.swing.ButtonGroup;
    import javax.swing.JButton;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JRadioButton;
    import javax.swing.JSlider;
    import javax.swing.SpringLayout;
    import javax.swing.event.ChangeEvent;
    import javax.swing.event.ChangeListener;import com.sun.awt.AWTUtilities;public class TranslucentWindow extends JFrame { private SpringLayout springLayout_1; private ButtonGroup buttonGroup = new ButtonGroup();
    private static final long serialVersionUID = 1L; private boolean isShapingSupported; private boolean isOpacityControlSupported; private boolean isTranslucencySupported; private GraphicsConfiguration translucencyCapableGC; private ComponentListener shapeListener = null; TranslucentWindow frame = this; private JRadioButton roundedRectangle; private JRadioButton Oval; private JCheckBox paintGradiCheckBox; private JPanel panel; // @SuppressWarnings("serial")
    public TranslucentWindow() { translucencyCapableGC = GraphicsEnvironment
    .getLocalGraphicsEnvironment().getDefaultScreenDevice()
    .getDefaultConfiguration(); isShapingSupported = AWTUtilities
    .isTranslucencySupported(AWTUtilities.Translucency.PERPIXEL_TRANSPARENT);
    isOpacityControlSupported = AWTUtilities
    .isTranslucencySupported(AWTUtilities.Translucency.TRANSLUCENT);
    isTranslucencySupported = AWTUtilities
    .isTranslucencySupported(AWTUtilities.Translucency.PERPIXEL_TRANSLUCENT); if (AWTUtilities.isTranslucencyCapable(translucencyCapableGC)) {
    translucencyCapableGC = null;
    GraphicsEnvironment env = GraphicsEnvironment
    .getLocalGraphicsEnvironment();
    GraphicsDevice[] devices = env.getScreenDevices(); for (int i = 0; i < devices.length && translucencyCapableGC == null; i++) {
    GraphicsConfiguration[] configs = devices[i]
    .getConfigurations();
    for (int j = 0; j < configs.length
    && translucencyCapableGC == null; j++) {
    if (AWTUtilities.isTranslucencyCapable(configs[j])) {
    translucencyCapableGC = configs[j];
    }
    }
    }
    if (translucencyCapableGC == null) {
    isTranslucencySupported = false;
    }
    }
    setSize(new Dimension(500, 400));
    getContentPane().setLayout(new BorderLayout()); panel = new JPanel() {

    private static final long serialVersionUID = 2656657329972014482L; protected void paintComponent(Graphics g) {
    if (g instanceof Graphics2D && paintGradiCheckBox.isSelected()) {
    final int R = 255;
    final int G = 0;
    final int B = 0;
    Paint p = new GradientPaint(0.0f, 0.0f, new Color(R, G, B,
    0), getWidth(), getHeight(),
    new Color(R, G, B, 255), true);
    Graphics2D g2d = (Graphics2D) g;
    g2d.setPaint(p);
    g2d.fillRect(0, 0, getWidth(), getHeight());
    } else {
    super.paintComponent(g);
    }
    }
    };
    springLayout_1 = new SpringLayout();
    panel.setLayout(springLayout_1);
    getContentPane().add(panel);
    setUndecorated(true); final JButton closeButton = new JButton();
    panel.add(closeButton);
    springLayout_1.putConstraint(SpringLayout.EAST, closeButton, 270,
    SpringLayout.WEST, panel);
    closeButton.addActionListener(new ActionListener() {
    public void actionPerformed(final ActionEvent e) {
    System.exit(0);
    }
    });
    closeButton.setText("Close"); Oval = new JRadioButton();
    panel.add(Oval);
    Oval.setSelected(true);
    Oval.addActionListener(new ActionListener() {
    public void actionPerformed(final ActionEvent e) {
    applyShape();
    }
    });
    buttonGroup.add(Oval);
    Oval.setText("Oval"); Oval.setEnabled(isShapingSupported); roundedRectangle = new JRadioButton();
    panel.add(roundedRectangle);
    springLayout_1.putConstraint(SpringLayout.NORTH, roundedRectangle, 170,
    SpringLayout.NORTH, panel);
    springLayout_1.putConstraint(SpringLayout.WEST, roundedRectangle, 180,
    SpringLayout.WEST, panel);
    springLayout_1.putConstraint(SpringLayout.EAST, Oval, 230,
    SpringLayout.WEST, panel);
    springLayout_1.putConstraint(SpringLayout.WEST, Oval, 0,
    SpringLayout.WEST, roundedRectangle);
    roundedRectangle.addActionListener(new ActionListener() {
    public void actionPerformed(final ActionEvent e) {
    applyShape();
    }
    });
    buttonGroup.add(roundedRectangle);
    roundedRectangle.setText("Rounded rectangle ");
    roundedRectangle.setEnabled(isShapingSupported); final JSlider slider = new JSlider();
    slider.setPaintLabels(true);
    panel.add(slider);
    springLayout_1.putConstraint(SpringLayout.SOUTH, closeButton, 28,
    SpringLayout.SOUTH, slider);
    springLayout_1.putConstraint(SpringLayout.NORTH, closeButton, 0,
    SpringLayout.SOUTH, slider);
    springLayout_1.putConstraint(SpringLayout.EAST, slider, 345,
    SpringLayout.WEST, panel);
    springLayout_1.putConstraint(SpringLayout.SOUTH, slider, 227,
    SpringLayout.NORTH, panel);
    springLayout_1.putConstraint(SpringLayout.NORTH, slider, 200,
    SpringLayout.NORTH, panel);
    slider.setValue(85);
    slider.addChangeListener(new ChangeListener() {
    public void stateChanged(final ChangeEvent e) {
    applyOpacity(((JSlider) e.getSource()).getValue());
    }
    });
    slider.setMinimum(5); paintGradiCheckBox = new JCheckBox();
    paintGradiCheckBox.setSelected(true);
    panel.add(paintGradiCheckBox);
    springLayout_1.putConstraint(SpringLayout.SOUTH, Oval, 26,
    SpringLayout.SOUTH, paintGradiCheckBox);
    springLayout_1.putConstraint(SpringLayout.NORTH, Oval, 0,
    SpringLayout.SOUTH, paintGradiCheckBox);
    springLayout_1.putConstraint(SpringLayout.SOUTH, paintGradiCheckBox,
    145, SpringLayout.NORTH, panel);
    springLayout_1.putConstraint(SpringLayout.EAST, paintGradiCheckBox,
    285, SpringLayout.WEST, panel);
    springLayout_1.putConstraint(SpringLayout.WEST, paintGradiCheckBox, 0,
    SpringLayout.WEST, Oval);
    paintGradiCheckBox.setText("Paint gradient");
    paintGradiCheckBox.setEnabled(isTranslucencySupported); center();
    } private synchronized void applyOpacity(int value) {
    if (!isOpacityControlSupported) {
    return;
    }
    panel.updateUI();
    AWTUtilities.setWindowOpacity(frame, ((float) value) / 100.0f); } private synchronized void applyShape() {
    if (!isShapingSupported) {
    return;
    }
    if (shapeListener != null) {
    shapeListener.componentResized(null);
    return;
    }
    panel.updateUI();
    final TranslucentWindow fd = frame;
    fd.addComponentListener(shapeListener = new ComponentAdapter() {
    // @Override
    public void componentResized(ComponentEvent evt) {
    Shape shape = null; if (roundedRectangle.isSelected()) {
    shape = new RoundRectangle2D.Float(0, 0, fd.getWidth(), fd
    .getHeight(), 100, 100); } else if (Oval.isSelected()) {
    shape = new Ellipse2D.Float(0, 0, fd.getWidth(), fd
    .getHeight());
    }
    AWTUtilities.setWindowShape(fd, shape);
    }
    }); } public void center() {
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    frame.setLocation((d.width - frame.getWidth()) / 2, (d.height - frame
    .getHeight()) / 2);
    } public static void main(String args[]) {
    new TranslucentWindow().setVisible(true);
    }
    }求详解 有些看不来
      

  6.   


    import com.sun.awt.AWTUtilities;
      

  7.   

    ---------- 编译 ----------
    TranslucentWindow.java:32: 警告:com.sun.awt.AWTUtilities 是 Sun 的专用 API,可能会在未来版本中删除
    import com.sun.awt.AWTUtilities;
                      ^
    TranslucentWindow.java:59: 警告:com.sun.awt.AWTUtilities 是 Sun 的专用 API,可能会在未来版本中删除
      isShapingSupported = AWTUtilities.isTranslucencySupported(AWTUtilities.Translucency.PERPIXEL_TRANSPARENT);
                                                                ^
    TranslucentWindow.java:59: 警告:com.sun.awt.AWTUtilities 是 Sun 的专用 API,可能会在未来版本中删除
      isShapingSupported = AWTUtilities.isTranslucencySupported(AWTUtilities.Translucency.PERPIXEL_TRANSPARENT);
                           ^
    TranslucentWindow.java:60: 警告:com.sun.awt.AWTUtilities 是 Sun 的专用 API,可能会在未来版本中删除
      isOpacityControlSupported = AWTUtilities.isTranslucencySupported(AWTUtilities.Translucency.TRANSLUCENT);
                                                                       ^
    TranslucentWindow.java:60: 警告:com.sun.awt.AWTUtilities 是 Sun 的专用 API,可能会在未来版本中删除
      isOpacityControlSupported = AWTUtilities.isTranslucencySupported(AWTUtilities.Translucency.TRANSLUCENT);
                                  ^
    TranslucentWindow.java:61: 警告:com.sun.awt.AWTUtilities 是 Sun 的专用 API,可能会在未来版本中删除
      isTranslucencySupported = AWTUtilities.isTranslucencySupported(AWTUtilities.Translucency.PERPIXEL_TRANSLUCENT);
                                                                     ^
    TranslucentWindow.java:61: 警告:com.sun.awt.AWTUtilities 是 Sun 的专用 API,可能会在未来版本中删除
      isTranslucencySupported = AWTUtilities.isTranslucencySupported(AWTUtilities.Translucency.PERPIXEL_TRANSLUCENT);
                                ^
    TranslucentWindow.java:63: 警告:com.sun.awt.AWTUtilities 是 Sun 的专用 API,可能会在未来版本中删除
      if(AWTUtilities.isTranslucencyCapable(translucencyCapableGC)){
         ^
    TranslucentWindow.java:72: 警告:com.sun.awt.AWTUtilities 是 Sun 的专用 API,可能会在未来版本中删除
      if (AWTUtilities.isTranslucencyCapable(configs[j])) {
          ^
    TranslucentWindow.java:181: 警告:com.sun.awt.AWTUtilities 是 Sun 的专用 API,可能会在未来版本中删除
      AWTUtilities.setWindowOpacity(frame, ((float) value) / 100.0f);
      ^
    TranslucentWindow.java:205: 警告:com.sun.awt.AWTUtilities 是 Sun 的专用 API,可能会在未来版本中删除
      AWTUtilities.setWindowShape(fd, shape);
      ^
    11 警告输出完成 (耗时 1 秒)