X243964552 2013-09-19 07:29 采纳率: 0%
浏览 3597

Java 中如何控制弹出窗口的关闭,类似于QQ的天气的弹窗

本人新手,我想做一个就类似于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

        }


    }
  • 写回答

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