线程休眠时,JToggle按钮无法取消选择,尽管创建了新的Thread,它应该处于休眠状态

时间:2016-12-09 08:46:05

标签: java multithreading swing

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()可以使用吗?

1 个答案:

答案 0 :(得分:2)

你这里弄错了。

Runnable 主题

您在上面显示的代码在一些额外的线程中执行任何操作。那里发生的一切都只是在Swing Event调度程序线程上运行!换句话说:上面的代码将那个线程放入" sleep"它负责您的所有UI更新。因此您的按钮变得无法响应。

如果你想让事情发生在他们自己的线程中,那么你必须创建并启动线程。例如,请参阅here

这里真正的答案是:多线程足够复杂没有将它与Swing / UI编程相结合。所以你实际上想退一步,花一些时间学习线程如何在Java中工作。然后,当你真正理解这些概念以及它们如何一起玩时;那么您可能已准备好在Swing应用程序中使用线程。换句话说:在尝试运行之前学会抓取。