首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Java 實現文本框數字滾動效果:線程控制與隨機數生成

     編輯:程式設計疑難解答

需求分析

文本框(JTextField/JLabel)顯示數字快速滾動,點擊「開始」啟動,點擊「停止」定格顯示一個隨機數字,類似抽獎/老虎機效果。

核心實現方案

使用 Swing Timer 或獨立線程 + SwingUtilities.invokeLater 更新 UI,確保線程安全。

完整可運行示例

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Random;

public class NumberScroller extends JFrame {
    private JTextField displayField;
    private JButton btnStart, btnStop;
    private Timer scrollTimer;
    private Random random = new Random();
    private volatile boolean running = false;

    public NumberScroller() {
        setTitle("數字滾動演示");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setLayout(new FlowLayout());

        displayField = new JTextField(10);
        displayField.setFont(new Font("Monospaced", Font.BOLD, 24));
        displayField.setHorizontalAlignment(JTextField.CENTER);
        displayField.setEditable(false);
        add(displayField);

        btnStart = new JButton("開始");
        btnStop = new JButton("停止");
        btnStop.setEnabled(false);
        add(btnStart);
        add(btnStop);

        // 使用 Swing Timer 確保在 EDT 更新 UI
        scrollTimer = new Timer(50, e -> { // 50ms 刷新一次
            if (running) {
                int num = random.nextInt(100); // 0-99
                displayField.setText(String.format("%02d", num));
            }
        });

        btnStart.addActionListener(e -> {
            running = true;
            scrollTimer.start();
            btnStart.setEnabled(false);
            btnStop.setEnabled(true);
        });

        btnStop.addActionListener(e -> {
            running = false;
            scrollTimer.stop();
            // 停止時顯示最終隨機數
            int finalNum = random.nextInt(100);
            displayField.setText(String.format("%02d", finalNum));
            btnStart.setEnabled(true);
            btnStop.setEnabled(false);
        });

        pack();
        setLocationRelativeTo(null);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new NumberScroller().setVisible(true));
    }
}

關鍵技術點解析

技術點說明
Swing Timer在事件分發線程(EDT)執行,直接更新 UI 安全,無需 invokeLater
volatile boolean保證多線程可見性,停止信號即時生效
String.format格式化輸出固定寬度,避免數字跳動導致界面抖動
按鈕狀態聯動防止重複點擊,邏輯清晰

進階擴展建議

  • 數字範圍配置:添加輸入框設置最小/最大值。
  • 滾動速度可調:滑塊控制 Timer 延遲(如 20ms-200ms)。
  • 停止動畫緩動:停止前逐漸增加延遲,模擬機械停轉效果。
  • 歷史記錄:列表記錄每次停止的數字。

常見問題排查

  1. 界面卡死:未使用 Timer 或線程中直接死循環 while(true) 且無 Thread.sleep,阻塞 EDT。
  2. 數字不變:random.nextInt() 參數錯誤或未調用 setText。
  3. 停止無反應:running 非 volatile,或未調用 timer.stop()。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved