我的gui程式包含(JPanel ,JFrame ,JLabel) JLabel :我將其編碼為從 (0x, 0y)到(200x ,0y)逐像素移動。當我將滑鼠放在名為“p”的面板上時它會啟動,但是當我嘗試運行這個程式時它會正確啟動,但是當我把滑鼠放在面板上時,所有東西都會停止幾秒鐘標簽移動到點( 200x, 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();
}
}
uj5u.com熱心網友回復:
您正在 Event-Dispatch-Thread 上運行您的代碼。那是不行的。將代碼在你的滑鼠輸入到一個 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();
uj5u.com熱心網友回復:
諸如此類的偵聽器方法mouseEntered()預計會在最多幾毫秒內快速回傳,因為 Java 僅在前一個事件處理完成時才會開始處理下一個用戶界面事件。
您mouseEntered()將回圈 200 次,每次迭代休眠 10 毫秒。因此,Java 將暫停其完整的 UI 事件處理,直到這 2 秒過去,這意味著這一次完全凍結 UI。
如果要創建移動標簽,則需要使用 aTimer或類似的東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/439790.html
上一篇:錯誤:在Chart.yaml中找到,但在charts/目錄中缺失:commonMongoDB
下一篇:按下按鈕時出現復選框,java
