本人新手,我想做一个就类似于QQ的天气的弹窗得东西,谁帮我完善一下后面的代码
我的想法是:鼠标移动到label上弹出一个窗口,移出这个label后几秒内判断鼠标移动是否到了这个窗口上,如没有就关闭这个窗口。
package com.frame;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
public class Frame01 extends JFrame implements MouseListener{
private JLabel loginlabel = null;
public void init() {
Container cont = this.getContentPane();
cont.setLayout(new BorderLayout());
JPanel panel = new JPanel(new GridBagLayout());
this.loginlabel = new JLabel("登陆");
this.loginlabel.addMouseListener(this);
panel.add(this.loginlabel, local(0, 0));
cont.add(panel);
}
public Frame01() {
this.init();
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);
this.setUndecorated(true);
// 设置窗口大小
this.setSize(380, 292);
//窗口初始位置设为中间
this.setLocationRelativeTo(null);
}
private GridBagConstraints local(int x, int y) {
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = x;
gbc.gridy = y;
return gbc;
}
public static void main(String[] args) {
Frame01 fm = new Frame01();
fm.setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e) {}
@Override
public void mousePressed(MouseEvent e) {}
@Override
public void mouseReleased(MouseEvent e) {}
//Dialog1 是外面已经做好的弹窗,这里我只做出了 移动到loginlabe上弹出Dialog1,但是后面的我就不会了
Dialog1 dia1 = new Dialog1();
@Override
public void mouseEntered(MouseEvent e) {
Point Location = this.getLocation();
if(e.getSource() == loginlabel) {
dia1.setLocation(Location.x + 385,Location.y);
dia1.setVisible(true);
}
}
@Override
public void mouseExited(MouseEvent e) {
// TODO Auto-generated method stub
}
}
Java 中如何控制弹出窗口的关闭,类似于QQ的天气的弹窗
- 写回答
- 好问题 0 提建议
- 追加酬金
- 关注问题
- 邀请回答
-
1条回答 默认 最新
- ChatGPTᴼᴾᴱᴺᴬᴵ 2023-02-14 06:38关注
该回答引用ChatGPT
您可以在 mouseExited 方法中使用 Timer 来设置一定时间后关闭弹窗。具体操作如下:
在 Frame01 类中定义一个 Timer 对象和一个布尔值,代码如下:
private Timer timer; private boolean isOnDialog = false;
在 init 方法中初始化 Timer,代码如下:
timer = new Timer(500, (event) -> { if (!isOnDialog) { dia1.dispose(); } });
在 mouseEntered 方法中添加对 Timer 的操作,代码如下:
timer.stop(); Point Location = this.getLocation(); if(e.getSource() == loginlabel) { dia1.setLocation(Location.x + 385,Location.y); dia1.setVisible(true); }
在 mouseExited 方法中添加对 Timer 的操作,代码如下:
timer.restart();
在 Dialog1 类中添加一个鼠标进入事件监听器,在鼠标进入弹窗时将 isOnDialog 置为 true,离开时将其置为 false,代码如下:
addMouseListener(new MouseAdapter() { @Override public void mouseEntered(MouseEvent e) { super.mouseEntered(e); isOnDialog = true; } @Override public void mouseExited(MouseEvent e) { super.mouseExited(e); isOnDialog = false; } });
这样,当鼠标移出 loginlabel 后,会在 500 毫秒后检查鼠标是否在弹窗上,如果不在,则关闭弹窗。同时,在弹窗上时,isOnDialog 会被置为 true,避免弹窗被误关闭。
解决 无用评论 打赏 举报
悬赏问题
- ¥15 宝塔面板一键迁移使用不了
- ¥15 求一个按键录像存储到内存卡的ESP32CAM代码
- ¥15 如何单独修改下列canvas推箱子代码target参数?,插入图片代替其形状,就是哪个绿色的圆圈每关用插入的图片替代
- ¥20 四叉树的创建和输出问题
- ¥15 javaweb连接数据库,jsp文件加载不出来
- ¥15 matlab关于高斯赛德尔迭代的应用编撰。(相关搜索:matlab代码|迭代法)
- ¥15 损失匹配问题,求解答
- ¥15 3500常用汉字书法体检测数据集下载
- ¥15 odoo17在制造模块或采购模块良品与次品如何分流和在质检模块下如何开发
- ¥15 Qt音乐播放器的音乐文件相对路径怎么写