首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我在MouseEntered()函数中使用when循环时,为什么所有的事情都是停止的呢?在Java中

当我在MouseEntered()函数中使用when循环时,为什么所有的事情都是停止的呢?在Java中
EN

Stack Overflow用户
提问于 2022-03-07 16:33:56
回答 2查看 44关注 0票数 0

我的gui程序,包含(JPanel,JFrame,JLabel) JLabel :我编码它从(0x,0y)移动到(200 x ,0y)像素。当我把鼠标放到名为"p"的面板上时,它就会启动,但是当我试图运行这个程序时,它是正确的,但是当我将鼠标放在面板上的所有东西停下来几秒钟时,标签移动到了点(200 x,0y),任何人都有任何解决这个问题的答案。

这个班的问题是:-

代码语言:javascript
运行
复制
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;


public class JFrameClass extends JFrame{
    JPanel p = new JPanel();
    JLabel l = new JLabel();
    
    public JFrameClass() {
        // TODO Auto-generated constructor stub
        setSize(800, 800);
        setLayout(null);
        setLocationRelativeTo(null);
        setResizable(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        
        l.setBounds(0, 0, 50, 50);
        l.setBackground(new Color(16, 16, 16));
        l.setOpaque(true);
        
        p.setBounds(320, 320, 100, 100);
        p.setBackground(new Color(16, 16, 16));
        p.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseEntered(MouseEvent evt) {
                boolean wd = true;
                int x = 0;
                while(true) {
                    if(x == 200) wd = false;
                    if(!wd) break;
                    l.setLocation(x, 0);
                    x++;
                    try {
                        Thread.sleep(10);
                    }catch(Exception e) {
                        
                    }
                }   
            }
        });
        
        
        add(p);
        add(l);
        
        
        
        setVisible(true);
    }
}

运行JFrameClass类的主类:-

代码语言:javascript
运行
复制
public class Main {
    public static void main(String[] args) {
        new JFrameClass();
        
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-03-07 16:40:13

您正在事件-调度-线程上运行您的代码。这是不-不。将mouseEntered中的代码放入SwingWorker中。

代码语言:javascript
运行
复制
SwingWorker<Void, Void> worker = new SwingWorker<Void, Void>() {
                 protected Void doInBackground() throws Exception {
                     for (int x = 0; x < 200; x++) {
                         l.setVisible(false);
                         l.setLocation(x, 0);
                         l.setVisible(true);
                         try {
                             Thread.sleep(10);
                         }catch(Exception e) {
                             
                         }
                     }
                     return null;
                 }
             };
             worker.execute();
票数 0
EN

Stack Overflow用户

发布于 2022-03-07 17:48:21

mouseEntered()这样的侦听器方法将在最多几毫秒内快速返回,因为只有在上一个事件处理完成后,Java才会开始处理下一个用户界面事件。

您的mouseEntered()将循环200次,每次迭代都休眠10毫秒。因此,Java将暂停其完整的UI事件处理,直到这2秒过去,这意味着此时将完全冻结UI。

如果您想要创建一个移动标签,您需要使用一个Timer或类似的东西。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71384300

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档