社区微信群开通啦,扫一扫抢先加入社区官方微信群
社区微信群
前段时间想弄个不规则窗体,就像游戏启动的那样。于是上网搜了一下,网上说的是用一个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则为白色,最后一个是透明度
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上。
如果觉得我的文章对您有用,请随意打赏。你的支持将鼓励我继续创作!