Java Sleep无法在循环中工作

我想在我的java程序中做的是,当我按下按钮时,它会按时间间隔在文本textfield中显示文本。 即按下按钮然后弹出一个jFrame ,并且有一个标签显示如下文字:第一秒:“1st”然后是1秒的时间滞后然后是第二件事:“第二件”

我是一个新手,我试图谷歌这个问题,但我找不到解决方案,即使3-4小时后我尝试了很多东西:睡觉,尝试抓住…

请将答案写得非常简单。

这是我的代码:在下面的代码中,当按下按钮时,jFrame会出现但是其中有一个白色屏幕,当总和结束时,它的屏幕变为灰色并显示答案….

  private void jButton5ActionPerformed(java.awt.event.ActionEvent evt) { See.setVisible(true);//See is the JFrame t007.setVisible(true);//Label in See l2.setVisible(true);//TextField in See int ran, g, d, col, ran2; double y = 1000 * (Double.parseDouble(t2.getText())); int x = (int) y; d = 0; double c = Math.pow(10, Integer.parseInt(t1.getText())); col = Integer.parseInt(t3.getText()); for (g = 0; g  (c / 10)) { g = g + 1; ran2 = ((int) (Math.random() * 10)) % 2; if (ran2 == 1) { ran = ran * (-1); } d = d + ran; if (d < 0) { ran = ran * (-1); d = d + (2 * ran); } l2.setVisible(true); t007.setText("" + ran); System.out.println("" + ran); jButton6.doClick(); //Pausing (Sleep) try { Thread.sleep(x); } catch (InterruptedException ex) { Thread.currentThread().interrupt(); } } } l2.setText("" + d); } 

Swing是一个单线程框架,也就是说,UI的所有交互和修改都应该发生在Event Dispatching Thread的上下文中。

除其他事项外,EDT负责处理重绘请求。

任何阻止EDT运行的东西(如Thread.sleep和循环很长时间)都会阻止它处理事件,实际上“悬挂”你的应用程序直到它被解除阻塞…

现在,我试图破译你的程序试图做的……但是失败了,所以相反……我做了一个相当的反击……

在此处输入图像描述

 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.EventQueue; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Random; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import javax.swing.JTextField; import javax.swing.Timer; import javax.swing.UIManager; import javax.swing.UnsupportedLookAndFeelException; public class TickOver { public static void main(String[] args) { new TickOver(); } public TickOver() { EventQueue.invokeLater(new Runnable() { @Override public void run() { try { UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) { } JFrame frame = new JFrame("Testing"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setLayout(new BorderLayout()); frame.add(new TestPane()); frame.pack(); frame.setLocationRelativeTo(null); frame.setVisible(true); } }); } public class TestPane extends JPanel { private JTextField field; private JButton button; private int tick; private Timer timer; public TestPane() { field = new JTextField(10); field.setEditable(false); button = new JButton("Start"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { button.setEnabled(false); tick = 0; timer.start(); } }); timer = new Timer(1000, new ActionListener() { @Override public void actionPerformed(ActionEvent e) { field.setText(Integer.toString(++tick)); if (tick > 4) { timer.stop(); button.setEnabled(true); } } }); timer.setInitialDelay(0); setLayout(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.gridwidth = GridBagConstraints.REMAINDER; add(field, gbc); add(button, gbc); } } } 

仔细查看Swing中的Concurrency以获取更多详细信息……

永远不应该在UI线程中睡觉 ,因为它会使UI滞后 。 好像这个过程需要一段时间才能完成,UI会卡住,用户体验会受到伤害。

使用其他机制,如TimerSwingWorker

Swing中的并发性

睡眠用户界面线程是非常糟糕的做法。 (因为这会导致应用程序无响应。)您应该将所有这些代码放在Runnable实例的Run()方法中:

 java.awt.EventQueue.invokeLater(new Runnable() { public void run() { // Your code here. } }); 

问题是您在事件派发线程上运行长时间运行的循环。 但是,这是必须调度应用程序的所有事件(如鼠标或键盘事件)的线程,但也重新绘制导致用户界面每次“脏”时重新绘制的事件。 这意味着,当您的for循环正在运行时,用户界面不会重新绘制,也不会处理任何其他事件。 你的用户界面冻结! 您的jButton5ActionPerformed方法应尽快返回,以便事件派发线程可以处理其他事件。 您的长时间运行操作应该由后台的单独线程运行。

一个很好的起点是关于Swing中的并发性的以下教程: http : //docs.oracle.com/javase/tutorial/uiswing/concurrency/

也许您可以使用SwingWorker类来执行后台工作: http : //docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html