newToggle1.addItemListener(new ItemListener() {
public void itemStateChanged(ItemEvent ev) {
while(ev.getStateChange() == ItemEvent.SELECTED) {
new Runnable(){
@Override
public void run() {
player.repeatPlayback();
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}}.run();
}
if(ev.getStateChange() == ItemEvent.DESELECTED) {
new Runnable(){
@Override
public void run() {
player.stopPlayback();
}
}.run();
}
}
});
我基本上为一个 JToggleButton 创建了 2 个 Itemlistener,一个用于释放,一个用于按下。
我想要的是我作为播放器对象创建的媒体播放器将播放声音。 (.repeatPlayback),然后程序等待 5 秒以再次播放。我希望如果我释放播放,我就会停止播放。出现的问题是JFrame应用程序普遍滞后,甚至无法用X关闭。需要通过任务管理器关闭。
这意味着thread.sleep()命令基本上使整个程序 hibernate ,使其无法运行。
我尝试通过创建不同的线程(如示例中所示)来解决它,但它不起作用。我也尝试了scheduleAtFixedRate,但它也不起作用。
我在互联网上没有找到任何内容,而且发现它非常具体。 有谁知道除 sleep 之外的另一种方法的解决方法?或者可以使用 .sleep() 的方式吗?
最佳答案
你在这里搞错了。
可运行不是线程。
您上面显示的代码没有在一些额外的线程中执行任何操作。那里发生的所有事情都只是在 Swing 事件调度程序线程上运行!换句话说:上面的代码将该线程置于“ sleep ”状态,该线程负责所有 UI 更新。因此你的按钮变得没有反应。
如果您希望事情在自己的线程中发生,那么您必须创建并启动一个线程。请参阅here例如。
真正的答案是:多线程已经足够复杂了,无需将其与 Swing/UI 编程相结合。因此,您实际上想退后一步,花一些时间研究Java 中的线程如何工作。然后,当您真正理解这些概念以及它们如何一起发挥作用时;那么您可能已经准备好在 Swing 应用程序中使用线程了。换句话说:在尝试运行之前先学会爬行。
关于java - 尽管创建了应该处于 sleep 状态的新线程,但在线程 sleep 时无法选择切换按钮,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41056394/