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秒钟再次播放。我希望如果我发布Playback,我会停止播放。问题出现了,JFrame应用程序通常滞后,甚至无法用X关闭。它需要通过任务管理器关闭。
这意味着thread.sleep()命令基本上会占用整个程序,因此无法操作。
我尝试通过创建不同的线程来解决它,就像在示例中一样,但它没有用。我也尝试过scheduleAtFixedRate,它也不起作用。
我没有在互联网上找到任何东西,也发现它非常具体。 有没有人知道另一种方法的解决方法,而不是睡眠?或者这个.sleep()可以使用吗?
答案 0 :(得分:2)
你这里弄错了。
Runnable 不 主题。
您在上面显示的代码不在一些额外的线程中执行任何操作。那里发生的一切都只是在Swing Event调度程序线程上运行!换句话说:上面的代码将那个线程放入" sleep"它负责您的所有UI更新。因此您的按钮变得无法响应。
如果你想让事情发生在他们自己的线程中,那么你必须创建并启动线程。例如,请参阅here。
这里真正的答案是:多线程足够复杂没有将它与Swing / UI编程相结合。所以你实际上想退一步,花一些时间学习线程如何在Java中工作。然后,当你真正理解这些概念以及它们如何一起玩时;那么您可能已准备好在Swing应用程序中使用线程。换句话说:在尝试运行之前学会抓取。