【问题标题】:Java JToggleButton freezes in While loopJava JToggleButton 在 While 循环中冻结
【发布时间】:2015-01-28 02:23:05
【问题描述】:
public void playMet() {

    int tempo = Integer.parseInt(met_speed.getText());
    tempo = tempo/60;
    int delay = tempo*1000; 

    if(Play.isSelected()) {
        try {
            FileInputStream in = new FileInputStream(new File("Click1.wav"));

            AudioStream as = new AudioStream(in);
            AudioPlayer.player.start(as);

            Thread.sleep(tempo*1000);
            playMet();

        } 
        catch (Exception e) {
            JOptionPane.showMessageDialog(null, e);
        }

    } 
    else
        System.out.println("not playing");
}

这是我的代码的一部分,基本上,当按下按钮时,它每分钟播放 X 次点击。

我用这样的 while 循环尝试了代码:

while(Play.isSelected()) {
.........
.........
}

这也没有用。在这两种情况下,程序都按应有的方式运行,但会冻结,我必须从任务管理器中将其关闭。

如何在按下按钮时调用函数并在取消选择时停止它?

附:刚看到下面两个帖子。必须去上班,稍后会检查他们,看看他们是否工作。谢谢你的帮助。

【问题讨论】:

    标签: java swing if-statement while-loop jtogglebutton


    【解决方案1】:

    递归调用阻塞了Event Dispatch Thread。您必须创建一个新线程才能不阻塞 EDT。

    public void playMet()
    {
        Thread t = new Thread(new Runnable()
        {
            @Override
            public void run()
            {
                while(Play.isSelected()){
                    //Your code
                }
            }
        };
        t.start();
    }
    

    【讨论】:

      【解决方案2】:

      你不需要 Thread.sleep(),你不需要递归或 while 循环。 你需要有状态的播放器。而且你的 UI 应该只改变播放器的状态。

      查看https://stackoverflow.com/a/7524627/2078908中的示例

      private final ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
      private ScheduledFuture<?> playingTask;
      private FileInputStream playing;
      
      public void playMet() {
          stopPlaying();
          playingTask = executor.scheduleWithFixedDelay(new Runnable() {
              @Override
              public void run() {
                  playMet();
              }
          }, 0, 1000, TimeUnit.MILLISECONDS);
      }
      
      public void playMetOnce(){
          try {
               IOUtils.close(playing);
               playing = new FileInputStream(new File("Click1.wav"));
      
               AudioStream as = new AudioStream(playing);
               AudioPlayer.player.start(as);
           } catch (Exception e)
           {
               JOptionPane.showMessageDialog(null, e);
           }
      }
      
      public void stopPlaying(){
          try {
              AudioPlayer.player.stop();
              IOUtils.close(playing);
              playing = null;
              if (playingTask != null) {
                  playingTask.cancel(false);
              }
              playingTask = null;
          } catch (Exception e) {
              JOptionPane.showMessageDialog(null, e);
          }
      }
      

      【讨论】:

      • 他想一遍又一遍地播放声音,直到用户停止它
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-20
      • 2019-04-09
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      相关资源
      最近更新 更多