本人新手,我想做一个就类似于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 14: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 C#调用python代码(python带有库)
- ¥15 矩阵加法的规则是两个矩阵中对应位置的数的绝对值进行加和
- ¥15 活动选择题。最多可以参加几个项目?
- ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
- ¥15 vs2019中数据导出问题
- ¥20 云服务Linux系统TCP-MSS值修改?
- ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
- ¥20 怎么在stm32门禁成品上增加查询记录功能
- ¥15 Source insight编写代码后使用CCS5.2版本import之后,代码跳到注释行里面
- ¥50 NT4.0系统 STOP:0X0000007B