我正在制作一个在jTable中打印100个数字的程序。此外,将有一个if语句来验证结果,并将根据打印的值设置特定颜色的jPanel。我需要稍微打印这些值,并确保jPanel根据每个值更改颜色。我尝试了以下代码,但似乎有错误:
try{
int n = 100;
int m = 1513;
int a = 19713;
double x = 177963;
int c = 1397;
double r;
int i;
Object[] res = new Object[n];
for(i=0;i< n;i++){
r = (a*x+c)%m;
x = r;
r = r/m;
res[i] = r;
Thread.sleep(1000);
if(r>=0.3){
jPanel3.setBackground(Color.green);
}else{
jPanel3.setBackground(Color.red);
}
}
DefaultTableModel dtm = new DefaultTableModel();
dtm.addColumn("Results", res);
// dtm.addColumn("resultado2", res);
jTable1.setModel(dtm);
}catch(Exception e){
Thread.currentThread().interrupt();
}
答案 0 :(得分:3)
但似乎有错误......
什么错误?
请注意,您永远不想在Swing应用程序的事件线程中调用Thread.sleep(...)
。改为使用Swing Timer。
答案 1 :(得分:2)
Swing是一个单线程框架。 Event Dispatching Thread负责处理重绘请求等。任何阻止EDT运行的动作都会阻止它处理任何重新绘制请求和其他事件,使你的应用程序看起来像挂起......
您还需要确保所有UI更新都是在EDT的上下文中进行的。
在你的情况下,你正在执行一个循环并使用Thread.sleep
,这是两个大的不,在处理Swing时没有...
正如您在duplicate question中所提到的,您应该使用javax.swing.Timer
。
这意味着您将不得不改变您的循环条件,例如......
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class ColorPane {
public static void main(String[] args) {
new ColorPane();
}
public ColorPane() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
ex.printStackTrace();
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private Color[] colors = new Color[]{Color.RED, Color.GREEN, Color.BLUE};
private int colorIndex = -1;
public TestPane() {
Timer timer = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
colorIndex++;
if (colorIndex >= colors.length) {
colorIndex = 0;
}
setBackground(colors[colorIndex]);
}
});
timer.start();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}