电脑日常使用过程中,我们常常可以看到许多软件有悬浮窗,方便快捷,甚至有的还可以在PPT里面使用。这是怎么实现的呢?今天我就来分享一下Java制作一个简单悬浮窗的方法,可以在PPT里面使用。
运行效果:
其实悬浮窗制作很简单,最重要的一点就是需要它总在最前显示,只需要使用JFrame类里面的一个方法即可实现;然后就是要去掉窗口边框,并设置窗口透明方便后面添加我们的贴图,自定义窗口形状等等。
代码如下:
JFrame jf=new JFrame(); //先实例化一个窗口对象
jf.setUndecorated(true); //窗口去边框
jf.setAlwaysOnTop(true); //设置窗口总在最前
jf.setBackground(new Color(0,0,0,0)); //设置窗口背景为透明色
去掉边框的窗口无法移动,我们要通过如下代码实现窗口拖动:
先在当前类里面创建两个整型全局变量分别作为我们鼠标所在位置的x,y坐标:
static int mouseAtX;
static int mouseAtY;
再通过添加窗口监听器的方法,监听鼠标按住窗口时的位置等,来实现拖动窗口:
jf.addMouseListener(new MouseAdapter() //设置窗口可拖动
{
public void mousePressed(MouseEvent e)
{
mouseAtX = e.getPoint().x;
mouseAtY= e.getPoint().y;
}
});
jf.addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseDragged(MouseEvent e)
{
jf.setLocation((e.getXOnScreen()-mouseAtX),(e.getYOnScreen()-mouseAtY));//设置拖拽后,窗口的位置
}
});
然后添加我们的贴图,按钮和主题,最好是背景透明的png格式图片,这样可以达到自定义你的悬浮窗外表的效果(因为窗口背景已经被设置成透明了,边框也去掉了):
示例图片:
//按钮1
ImageIcon run=new ImageIcon("res\\button\\pptrun.png"); //实例化图像对象以作为按钮贴图
JButton PPTrun=new JButton(run); //将上面的图像对象设置为按钮贴图
PPTrun.setContentAreaFilled(false); //设置按钮背景透明
PPTrun.setBorderPainted(false); //去掉按钮边框
PPTrun.setBounds(8, 311, 130, 58); //设置按钮大小及位置
//按钮2
ImageIcon back=new ImageIcon("res\\button\\pptback.png"); //实例化图像对象以作为按钮贴图
JButton PPTback=new JButton(back); //将上面的图像对象设置为按钮贴图
PPTback.setContentAreaFilled(false); //设置按钮背景透明
PPTback.setBorderPainted(false); //去掉按钮边框
PPTback.setBounds(8, 373, 130, 58);
//按钮3
ImageIcon exit=new ImageIcon("res\\button\\pptexit.png"); //实例化图像对象以作为按钮贴图
JButton PPTexit=new JButton(exit); //将上面的图像对象设置为按钮贴图
PPTexit.setContentAreaFilled(false); //设置按钮背景透明
PPTexit.setBorderPainted(false); //去掉按钮边框
PPTexit.setBounds(8, 432, 130, 58); //设置按钮大小及位置
ImageIcon c=new ImageIcon("res\\character\\1.png"); //实例化图像对象以作为窗口主题贴图
JLabel l=new JLabel(c); //把上面的主题贴图添加到标签对象里面去
l.setBounds(0, 136, 144, 177); //设置标签对象大小及位置
当然,在这里有一点很重要 ,那就是setBounds()方法的使用。
这个方法是用于设置组件在窗口里面的位置及大小的方法。
这个方法在swing里面的所有组件都适用(JButton按钮,JLabel标签,JTextField输入框等等),上面的代码也有,用法如下:
object.setBounds(x坐标,y坐标,组件宽,组件高);
这里object是我们创建的对象(如JButton按钮,JLabel标签,JTextField输入框等等),x、y坐标都是相对于窗口内部的坐标,(0,0)在窗口的最左上方,组件宽、高的单位都为像素。在创建带有图片的JLabel对象或JButton按钮对象时,尤其要注意把JLabel或JButton的宽、高设置得与图片一致,否则图片无法显示完全,像我这里图片大小为:144x177
因此在上面可以看到我的JLabel对象setBounds里面的宽和高分别是144和177。
不过手动输入数据并一次次调试是很难的,我这里使用了WindowBuilder插件,在里面拖动组件即可方便地设置组件位置,也会生成对应代码。不过还是要注意最好后面手动将宽高改的和图片一致。
使用windowbuilder插件里面的Absolute layout布局应用到窗口即可,这里不再过多赘述插件使用方法,请自行百度。
最后使用JPanel面板对象规整我们的各个组件再添加到窗口里面:
JPanel p=new JPanel();
p.setLayout(null);
//添加各个组件
p.add(l);
p.add(PPTrun);
p.add(PPTback);
p.add(PPTexit);
p.setOpaque(false); //设置面板对象背景透明
jf.getContentPane().add(p); //把面板对象添加到窗口里面
jf.show(); //显示窗口
记得JPanel也要设置背景透明!
这样我们的悬浮窗就做好了,还可以在PPT里面显示!
完整代码如下:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class FloatWindow{
static int mouseAtX;
static int mouseAtY;
public static void main(String[] args) {
Toolkit kit=Toolkit.getDefaultToolkit();
Dimension sc=kit.getScreenSize();
JFrame jf=new JFrame();
jf.setSize(145,500);
jf.setLocation(sc.width/45,sc.height/9);
jf.setUndecorated(true); //窗口去边框
jf.setAlwaysOnTop(true); //设置窗口总在最前
jf.setBackground(new Color(0,0,0,0)); //设置窗口背景为透明色
jf.addMouseListener(new MouseAdapter() //设置窗口可拖动
{
public void mousePressed(MouseEvent e)
{
mouseAtX = e.getPoint().x;
mouseAtY= e.getPoint().y;
}
});
jf.addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseDragged(MouseEvent e)
{
jf.setLocation((e.getXOnScreen()-mouseAtX),(e.getYOnScreen()-mouseAtY));//设置拖拽后,窗口的位置
}
});
//按钮1
ImageIcon run=new ImageIcon("res\\button\\pptrun.png"); //实例化图像对象以作为按钮贴图
JButton PPTrun=new JButton(run); //将上面的图像对象设置为按钮贴图
PPTrun.setContentAreaFilled(false); //设置按钮背景透明
PPTrun.setBorderPainted(false); //去掉按钮边框
PPTrun.setBounds(8, 311, 130, 58); //设置按钮大小及位置
//按钮2
ImageIcon back=new ImageIcon("res\\button\\pptback.png"); //实例化图像对象以作为按钮贴图
JButton PPTback=new JButton(back); //将上面的图像对象设置为按钮贴图
PPTback.setContentAreaFilled(false); //设置按钮背景透明
PPTback.setBorderPainted(false); //去掉按钮边框
PPTback.setBounds(8, 373, 130, 58);
//按钮3
ImageIcon exit=new ImageIcon("res\\button\\pptexit.png"); //实例化图像对象以作为按钮贴图
JButton PPTexit=new JButton(exit); //将上面的图像对象设置为按钮贴图
PPTexit.setContentAreaFilled(false); //设置按钮背景透明
PPTexit.setBorderPainted(false); //去掉按钮边框
PPTexit.setBounds(8, 432, 130, 58); //设置按钮大小及位置
ImageIcon c=new ImageIcon("res\\character\\1.png"); //实例化图像对象以作为窗口主题贴图
JLabel l=new JLabel(c); //把上面的主题贴图添加到标签对象里面去
l.setBounds(0, 136, 144, 177); //设置标签对象大小及位置
JPanel p=new JPanel();
p.setLayout(null);
p.add(l);
p.add(PPTrun);
p.add(PPTback);
p.add(PPTexit);
p.setOpaque(false);
jf.getContentPane().add(p);
jf.show();
}
}
本教程到这里就结束了,感谢大家观看!