首页 » 原創 » 正文

[原创]java实现窗体透明的两种思路与实现

最近老师布置了窗体透明的作业,我提供了两种思路1.使用滑块控制属性调节窗体透明,运行时单击下屏幕左上角的方块出现滑块调节 2.利用屏幕截图,显示窗体下面的背景,映射至窗体容器,实现伪透明。
思路1:
import java.awt.BorderLayout;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;


public class Opacity extends JFrame{
	JSlider slider=new JSlider(0,9,0);
	public Opacity(){
		this.setTitle("窗体透明度测试");
		this.setSize(400,300);
		this.setDefaultCloseOperation(this.DISPOSE_ON_CLOSE);
			JButton btn=new JButton();
			btn.addActionListener(new ActionListener(){

				@Override
				public void actionPerformed(ActionEvent e) {
					setOpacity();
					
				}});
			this.add(btn);
			this.setUndecorated(true);
			this.setVisible(true);
	}
	
	public static void main(String[] args) {
	Opacity opt= new Opacity();

	}
	public void setOpacity(){
		JDialog dialog =new JDialog(this,"窗体透明度测试",true);
		dialog.setSize(270,100);
		dialog.setResizable(false);
		Dimension thisSize=this.getSize();
		Point thisPoint=this.getLocation();
		Dimension diaSize=dialog.getSize();
		dialog.setLocation(thisPoint.x+(thisSize.width-diaSize.width)/2,
				thisPoint.y+(thisSize.height-diaSize.height)/2);
		JLabel label=new JLabel("调节透明度:");
		slider.addChangeListener(new ChangeListener(){

			@Override
			public void stateChanged(ChangeEvent e) {
				slider();
				
			}});
		JPanel upPanel=new JPanel(new FlowLayout());
		upPanel.add(label);
		upPanel.add(slider);
		dialog.add(upPanel,BorderLayout.CENTER);
		dialog.setVisible(true);
		
	}
	public void slider(){
		double value=slider.getValue()/10.0;
		if(com.sun.awt.AWTUtilities.isWindowOpaque(this)){
			com.sun.awt.AWTUtilities.setWindowOpacity(this, (float)(1-value));
			slider.setCursor(new Cursor(Cursor.HAND_CURSOR));
		}else{
			JOptionPane.showMessageDialog(this, "low");
		}
	}
}
第二种
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
 
import javax.swing.JFrame;
import javax.swing.JPanel;
 
public final class Test extends JFrame {
	JPanel jp;
    Image Background;
    Point p0;
    Point p1;
 
    public Test() {
        jp = new JPanel();
        this.getContentPane().add(jp);
        
        try {
            Robot r = new Robot();
            Toolkit tk = Toolkit.getDefaultToolkit();
            Dimension dm = tk.getScreenSize();
            Background = r.createScreenCapture(new Rectangle(0, 0, (int) dm
                    .getWidth(), (int) dm.getHeight()));
 
            System.out.println(Background);
        } catch (Exception e) {
            e.printStackTrace();
        }
        this.setSize(600, 600);
        this.setVisible(true);
    }
 
    public void paint(Graphics g) {
        p0 = this.getLocationOnScreen();
        System.out.println(p0);
        p1 = new Point(-p0.x, -p0.y);
        g.drawImage(Background, p1.x, p1.y, null);
        repaint();
    }
 
    public static void main(String[] args) {
        new Test();
    }
}

本文共 2 个回复

发表评论