java - 尽管创建了应该处于 sleep 状态的新线程,但在线程 sleep 时无法选择切换按钮

标签 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 秒以再次播放。我希望如果我释放播放,我就会停止播放。出现的问题是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/

相关文章:

java - 使用 GWT 编译时替换类

java - Hadoop HDFS 部署

java - Swing JTextArea 上的文本鼠标悬停弹出窗口?

objective-c - NSManagedObjectContext 通过通知中心问题在多个线程上保存/合并

multithreading - 使用 Go 1.2 的线程 CGO

java - 如何在 JPanel 中创建带边框单元格的 JTable?

java - 当我从 Netbeans 运行 JFrame 程序时,印地语字体可见,但在运行 .jar 文件时不可见

java - 如何修复 "org.hibernate.boot.registry.selector.spi.StrategySelectionException: Unable to resolve name [org.hibernate.dialect.MySQL8Dialect]"?

java - 如何确定 Wildfly 10 支持的密码套件

c++ - 从主循环访问线程变量 - C++ - Windows