为什么当我在 MouseEntered() 函数中使用 while 循环时一切都停止了?在 Java

why all thing is stop when i'll use while loop in MouseEntered() Function ?? In Java

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

Class 有问题:-

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);
    }
}

主要Class那个运行JFrameClassclass:-

public class Main {
    public static void main(String[] args) {
        new JFrameClass();
        
    }
}

您是 运行 您在 Event-Dispatch-Thread 上的代码。那是 no-no。将鼠标中的代码输入到一个SwingWorker中。

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();

mouseEntered() 这样的侦听器方法预计会 return 快速,最多几毫秒,因为 Java 将仅在前一个事件处理时才开始处理下一个用户界面事件已完成。

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

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