Java Sleep无法循环工作[关闭]
Posted
技术标签:
【中文标题】Java Sleep无法循环工作[关闭]【英文标题】:Java Sleep not working in loop [closed] 【发布时间】:2013-09-28 01:30:17 【问题描述】:我想在我的 java 程序中做的是,当我按下按钮时,它会每隔一段时间在 textfield
中显示文本。
即我按下按钮然后弹出jFrame
并且有一个标签显示如下文本:
第 1 秒:“第 1 秒”
然后是 1 秒的时间延迟
然后是第二件事:“2nd”
我是新手,我尝试用谷歌搜索这个问题,但即使在 3-4 小时后我也找不到解决方案 我尝试了很多东西:sleep,try n catch...
请把答案写得很简单。
这是我的代码: 在下面的代码中,当按下按钮时,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 < col;)
ran = (int) (Math.random() * (c)); // Random Number Creation Starts
if (ran > (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);
【问题讨论】:
使用SwingWorker
提供后台处理和同步以返回事件队列。更多详情请见Concurrency in Swing
不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 将“冻结”。而不是调用Thread.sleep(n)
实现一个Swing Timer
用于重复任务或SwingWorker
用于长时间运行的任务。有关详细信息,请参阅Concurrency in Swing。
嘿,伙计们,我听不懂你们,你们能不能简单点,写下代码,然后告诉我什么和如何。请
@DakshShah 先付钱给我们 ;)
【参考方案1】:
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);
请仔细查看Concurrency in Swing 了解更多详情...
【讨论】:
嗨,我想要这个东西,但我不知道如何在我的程序中添加它 我不知道如何创建一个类以及main是做什么的 在我的代码 main 中自动有一些代码,我不知道如何将这些代码放入其中;如何创建所有类 请帮忙,@madprogrammer 先仔细看看this,其实看完整个教程对你会有用的。【参考方案2】:您应该永远不要在 UI 线程中睡觉,因为它会使 UI 滞后。好像这个过程需要时间才能完成,UI 会卡住,用户体验会受到影响。
使用其他机制,例如 Timer
或 SwingWorker
Concurrency in Swing
【讨论】:
@DakshShah cmets 已经包含帮助您入门的链接。阅读这些内容并询问您是否仍有问题。我也会添加那个链接。 什么是线程,什么是UI,如何在我的程序中集成定时器或swing worker【参考方案3】:休眠用户界面线程是非常糟糕的做法。 (因为这会导致应用程序变得无响应。)您应该将所有这些代码放在 Runnable
实例的 Run()
方法中:
java.awt.EventQueue.invokeLater(new Runnable()
public void run()
// Your code here.
);
【讨论】:
如果他睡在 runnable 中它不会有任何影响,你也可以在 EDT 上运行它... 我应该把这一切放在哪里,因为我告诉过你我完全是一个新手 我使用 netbeans,我只是在按钮上编码,但不是这样,请如何解释 ASwingWorker
将是一个更合适的解决方案,因为它提供了将更新重新同步回 EDT 的便捷方法 - 恕我直言【参考方案4】:
问题在于您在事件调度线程上运行了长时间运行的循环。但这是必须调度应用程序的所有事件(如鼠标或键盘事件)的线程,但也会重新绘制事件,导致您的用户界面在每次“脏”时都被重新绘制。这意味着,当您的 for 循环运行时,不会重新绘制用户界面,也不会处理任何其他事件。您的用户界面冻结! 您的 jButton5ActionPerformed 方法应尽快返回,以便事件调度线程可以处理其他事件。您的长时间运行的操作应该由后台的单独线程运行。
以下关于 Swing 并发性的教程是一个很好的起点: http://docs.oracle.com/javase/tutorial/uiswing/concurrency/
也许您可以使用 SwingWorker 类来执行您的后台工作: http://docs.oracle.com/javase/6/docs/api/javax/swing/SwingWorker.html
【讨论】:
以上是关于Java Sleep无法循环工作[关闭]的主要内容,如果未能解决你的问题,请参考以下文章
while 循环中的 Thread.sleep() 不能正常工作?