JLabel 上的动态 Swing 刷新

Dynamic Swing Refresh on JLabel

我正在练习 Java 学习编程。我创建了一个 main class ,我只是在其中生成随机数并将每个数字添加到数组列表中。每次我在数组列表中插入一个新数字时,我都会计算变化的数组列表的平均值。

我卡在了以下部分:每次计算新平均值(每次添加随机数)时,我都想在 JFrame 上实时显示。我为此创建了一个 JFrame 和一个 JLabel。然后需要不断更新JLabel。

从那里我需要去哪些方向?摇摆工人?摆动计时器?行动听众?我已经阅读了一些关于将它 运行 置于后台、多线程的必要性的帖子,但我现在有点不知所措,因此我们将不胜感激。

public class TestSwing {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

    TestFrame frame = new TestFrame(); 
    frame.setBounds(300, 200, 700, 400);

    // Variables
    Random rn = new Random();
    ArrayList<Integer> elements = new ArrayList<>();

    //Generate random numbers
    for(int i =0; i < 100; i++)
    {
        int answer = rn.nextInt(10) + 1;

        // Add random numbers to array
        elements.add (answer);

            //Get average of array every time a new number is added to the array
            int sum = 0;
            for(int j=0; j < elements.size() ; j++)
            {
                sum = sum + elements.get(j); 
            }
            //calculate average value
            double average = sum / elements.size();

   //Show Frame
   frame.setVisible(true);
   // This is where I am stuck
    }      
} 

}

A java.util.Timer 很简单,而且会做得很好。请阅读 this and this 了解更多信息。

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
new Timer().scheduleAtFixedRate(new TimerTask() {
    int counter = 0;

    @Override
    public void run() {
        counter++;
        if (counter >= 10) { // If ran 10 times, stop.
            this.cancel();
        }
        int answer = rn.nextInt(10) + 1;
        elements.add(answer);
        int sum = 0;
        for (int j = 0; j < elements.size(); j++) {
            sum = sum + elements.get(j);
        }
        double average = sum / elements.size();
        label.setText(String.valueOf(average)); // Set the text of the
                                                // label (automatically
                                                // repaints panel)
        System.out.println(String.valueOf(average));
    }
}, 500, 1000); // Run every second (= 1000 milliseconds), wait 500
                // milliseconds before starting it.

你遗漏了很多东西。这是您的代码的更好版本,您需要像 LuxxMiner 建议的那样添加一个计时器。

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

public class TestSwing {

/**
 * @param args the command line arguments
 */

    public static void main(String[] args) {

        JFrame frame = new JFrame();
        frame.setBounds(300, 200, 700, 400);

        //Set layout
        frame.setLayout(new BorderLayout());


        // Variables
        Random rn = new Random();
        ArrayList<Integer> elements = new ArrayList<>();

        //Generate random numbers
        for(int i =0; i < 100; i++)
        {
            int answer = rn.nextInt(10) + 1;

            // Add random numbers to array
            elements.add (answer);

                //Get average of array every time a new number is added to the array
                int sum = 0;
                for(int j=0; j < elements.size() ; j++)
                {
                    sum = sum + elements.get(j); 
                }
                //calculate average value
                double average = sum / elements.size();
        }  
        //Add label
        JLabel label = new JLabel(String.valueOf(average));
        frame.add(label, BorderLayout.CENTER);

        //Show Frame
        frame.setVisible(true);   
} 
}