java实现不规则窗体 - Go语言中文社区

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\u80CCu666Fu82B1u7EB92_u526Fu672C1.png"));
		contentPane.add(label, BorderLayout.CENTER);
		
	}

}


以下是效果:


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

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

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

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/qq_33222871/article/details/50722925
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-08 11:49:35
  • 阅读 ( 632 )
  • 分类:

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢