我的gui程序,包含(JPanel,JFrame,JLabel) JLabel :我编码它从(0x,0y)移动到(200 x ,0y)像素。当我把鼠标放到名为"p"的面板上时,它就会启动,但是当我试图运行这个程序时,它是正确的,但是当我将鼠标放在面板上的所有东西停下来几秒钟时,标签移动到了点(200 x,0y),任何人都有任何解决这个问题的答案。
这个班的问题是:-
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类的主类:-
public class Main {
    public static void main(String[] args) {
        new JFrameClass();
        
    }
}发布于 2022-03-07 16:40:13
您正在事件-调度-线程上运行您的代码。这是不-不。将mouseEntered中的代码放入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();发布于 2022-03-07 17:48:21
像mouseEntered()这样的侦听器方法将在最多几毫秒内快速返回,因为只有在上一个事件处理完成后,Java才会开始处理下一个用户界面事件。
您的mouseEntered()将循环200次,每次迭代都休眠10毫秒。因此,Java将暂停其完整的UI事件处理,直到这2秒过去,这意味着此时将完全冻结UI。
如果您想要创建一个移动标签,您需要使用一个Timer或类似的东西。
https://stackoverflow.com/questions/71384300
复制相似问题