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);
}
}
我正在练习 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);
}
}