目录
JFrame自带的窗体装饰很难看,所以我们可以自定义个窗体样式
首先,我们需要去掉默认装饰
使用JFrame的 setUndecorated 方法
frame.setUndecorated(true);
去掉窗体样式后,就会需要很多的...麻烦
需要自己写窗口最小化最大化关闭按钮,和logo什么的,还有拖动...
拖动菜单移动窗体
下面是我写的一个案例,通过菜单栏拖动 移动窗体(使用的 Window Classic风格).
没去掉默认样式之前是这样的
代码如下
/**
* 第一个窗体,主窗体.
* @author Shendi <a href='tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=1711680493'>QQ</a>
* @version 1.0
*/
public class MainView extends JFrame {
private static final long serialVersionUID = 1000L;
static Point p = new Point();
public MainView() throws IOException {
setTitle("任务管理");
// 设置图标
//setIconImage(ImageIO.read(getClass().getResourceAsStream("/shendi_app_logo.png")));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 549, 370);
// 去掉样式
setUndecorated(true);
// 拖动菜单栏事件,鼠标点击记录位置
MenuBarEvent menuBarEvent = new MenuBarEvent(this);
JMenuBar menuBar = new JMenuBar();
menuBar.addMouseListener(menuBarEvent);
menuBar.addMouseMotionListener(menuBarEvent);
JMenu setting = new JMenu("设置");
menuBar.add(setting);
JMenuItem exit = new JMenuItem("退出程序");
JCheckBoxMenuItem netSave = new JCheckBoxMenuItem("云端保存");
setting.add(netSave);
setting.add(exit);
JMenu helpMenu = new JMenu("帮助");
menuBar.add(helpMenu);
JMenuItem aboutUS = new JMenuItem("关于我们");
helpMenu.add(aboutUS);
setJMenuBar(menuBar);
getContentPane().setLayout(null);
}
public static void main(String[] args) throws IOException {
new MainView().setVisible(true);
}
}
菜单栏拖动事件
我们通过鼠标监听来进行移动窗体
计算方法是 当前窗体位置 - 鼠标目前位置 - 鼠标上次位置
代码如下
/**
* 菜单栏事件,包含点击,拖动等.<br>
* 窗口拖动效果,鼠标点击记录位置,拖动将位置设置<br>
* <b>拖动的窗体位置 = 窗体当前位置 + 现在的鼠标位置 - 鼠标上次保存的位置</b>
* @author Shendi <a href='tencent://AddContact/?fromId=45&fromSubId=1&subcmd=all&uin=1711680493'>QQ</a>
* @version 1.0
*/
public class MenuBarEvent extends MouseAdapter implements MouseMotionListener {
private int xOffset,yOffset;
/**
* 需要被控制的窗体.
*/
private JFrame frame;
/**
* 创建一个控制指定窗体的菜单栏事件.
* @param frame 窗体.
*/
public MenuBarEvent(JFrame frame) { this.frame = frame; }
/**
* 鼠标拖动后移动窗体.
*/
@Override public void mouseDragged(MouseEvent mouse) {
frame.setLocation(frame.getX() + mouse.getX() - xOffset, frame.getY() + mouse.getY() - yOffset);
}
/**
* 鼠标按下后记录当前鼠标位置
*/
@Override public void mousePressed(MouseEvent mouse) {
xOffset = mouse.getX();
yOffset = mouse.getY();
}
@Override public void mouseMoved(MouseEvent e) {}
}