java实现不规则窗体

  前段时间想弄个不规则窗体,就像游戏启动的那样。于是上网搜了一下,网上说的是用一个com.sun.awt.AWTUtilities类来实现,结果我发现这个类是JDK6里才有的,我用的是JDK1.8,根本找不到这个类。无奈,只能放弃。只能自己想了!

下面是做法:

首先,新建一个JFrame,我是用的Eclipse带的可视化编辑插件,直接就可以创建一个jframe窗体。 然后,将窗体的标题栏修饰去掉,用

setUndecorated(true);

就可以创建一个没有标题栏的方框窗体,然后设置窗体的背景色,
<span style="font-size:24px;">setBackground(new Color(0,0,0,0));</span>//前三个参数是颜色三原色配比,全为0则为白色,最后一个是透明度

最后一个参数是透明度,如果设为0则完全透明,因为我是想用一张不规则图片来创建窗体,那么这张图片在没有影像的地方就应该显示窗体后面的图像。接着,new 一个JLable用来存放图片,将这个JLable放于中央就行了。另外为了可以移动窗口,给JPanel添加一个鼠标按下事件。

contentPane.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				mx=e.getXOnScreen();//记录鼠标按下时的坐标
				my=e.getYOnScreen();
				jfx=getX();//记录窗体这时的坐标
				jfy=getY();
			}
		});

其中mx,my,jfx,jfy,都是类的成员属性,contentPane是直接放JFrame上的JPanel,。再添加一个鼠标拖拽事件

contentPane.addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseDragged(MouseEvent e) {
				setLocation(jfx+(e.getXOnScreen()-mx), jfy+(e.getYOnScreen()-my));
			}
		});

以下是全部代码:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Graphics;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.JLabel;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

public class NOfang extends JFrame {

	private JPanel contentPane;
	int mx,my,jfx,jfy;
	
	public static void main(String[] args) {
		EventQueue.invokeLater(new Runnable() {
			public void run() {
				try {
					NOfang frame = new NOfang();
					frame.setVisible(true);
				} catch (Exception e) {
					e.printStackTrace();
				}
			}
		});
	}

	
	public NOfang() {
		setUndecorated(true);
		setBackground(new Color(0,0,0,0));
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setBounds(100, 100, 930, 984);
		contentPane = new JPanel();
		contentPane.addMouseMotionListener(new MouseMotionAdapter() {
			public void mouseDragged(MouseEvent e) {
				setLocation(jfx+(e.getXOnScreen()-mx), jfy+(e.getYOnScreen()-my));
			}
		});
		contentPane.addMouseListener(new MouseAdapter() {
			public void mousePressed(MouseEvent e) {
				mx=e.getXOnScreen();
				my=e.getYOnScreen();
				jfx=getX();
				jfy=getY();
			}
		});
		contentPane.setOpaque(false);//可视化编辑下会自动创建一个JPanel,也要将这个JPanel设为透明,
		contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
		contentPane.setLayout(new BorderLayout(0, 0));
		setContentPane(contentPane);
		
		JLabel label = new JLabel("");
		label.setIcon(new ImageIcon("D:\\software\\ja\\workspace\\test\\lib\\\u80CC\u666F\u82B1\u7EB92_\u526F\u672C1.png"));
		contentPane.add(label, BorderLayout.CENTER);
		
	}

}


以下是效果:


注意事项:1.图片必须是透明前景,不带背景框,网上下的图片大多带一个白色的背景框,即这时图片依旧是规则的矩形,需要处理成不带背景框。

2.窗体透明的部分无法捕捉鼠标焦点。一个完全透明的窗体是无法捕捉焦点的。原因暂且不明。

3.如果想添加其他组件,需将放置了JLable的JPanel布局管理器设置为null,即绝对布局,此时JLable需要设置尺寸再放置到JPanel上。

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值