前段时间想弄个不规则窗体,就像游戏启动的那样。于是上网搜了一下,网上说的是用一个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上。