Java Swing Worker未停止

Java Swing Worker未停止,java,swing,swingworker,jlayer,Java,Swing,Swingworker,Jlayer,我正在使用JavaSwing构建一个应用程序。该应用程序基本上从Broadcastify网站获取警察广播流并播放 此时的应用程序有两个按钮:“芝加哥警察”、“芝加哥消防队和EMS”。当按下芝加哥警察按钮时,芝加哥警察流开始播放。但是,当按下同一个按钮或不同的按钮时,流不会停止,它们只是自己播放。我想这和那个荡秋千的人有关 基本上,我希望它做的是播放一个流,当按下另一个流按钮时,停止当前流,然后启动新的流 我已尝试使用.cancel(true)方法,但这不起作用 这是我的密码- 框架类别: imp

我正在使用JavaSwing构建一个应用程序。该应用程序基本上从Broadcastify网站获取警察广播流并播放

此时的应用程序有两个按钮:“芝加哥警察”、“芝加哥消防队和EMS”。当按下芝加哥警察按钮时,芝加哥警察流开始播放。但是,当按下同一个按钮或不同的按钮时,流不会停止,它们只是自己播放。我想这和那个荡秋千的人有关

基本上,我希望它做的是播放一个流,当按下另一个流按钮时,停止当前流,然后启动新的流

我已尝试使用.cancel(true)方法,但这不起作用

这是我的密码-

框架类别:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class frame extends JFrame{

private JPanel north, south;
private JButton chicagoPolice, chicagoFireEms;
private JTextField status;
stream s = new stream();

public frame(){
    //set title
    super("Broadcastify Streams");

    //north panel
    north = new JPanel();
    north.setPreferredSize(new Dimension(500,250));
    north.setBackground(Color.RED);
    add(north, BorderLayout.NORTH);

    //Chicago Police button
    chicagoPolice = new JButton("Chicago Police");
    north.add(chicagoPolice);

    //Chicago Fire and EMS
    chicagoFireEms  = new JButton("Chicago Fire and EMS");
    north.add(chicagoFireEms);

    //south panel
    south = new JPanel();
    south.setBackground(Color.BLUE);
    add(south, BorderLayout.SOUTH);

    //status bar
    status = new JTextField(15);
    status.setEditable(false);
    south.add(status, BorderLayout.NORTH);

    //button action listeners
    chicagoPolice.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            s.setStream("http://relay.broadcastify.com:80/il_chicago_police2");
            s.playStream();
            status.setText("Playing - Chicago Police");
        }
    });

    chicagoFireEms.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent e){
            s.setStream("http://relay.broadcastify.com:80/836454979");
            s.playStream();
            status.setText("Playing - Chicago Fire and EMS");
        }
    });
}
}
流类:

import java.net.URL;
import java.net.URLConnection;

import javax.swing.SwingWorker;

import javazoom.jl.player.Player;

public class stream {

private SwingWorker<Void,Void> worker;
private String stream;
private Player player;

public stream(){
    stream = "";
}

public void setStream(String radioStream){
    stream = radioStream;
}

public void playStream(){

    worker = new SwingWorker<Void,Void>(){
        public Void doInBackground() throws Exception{

            URLConnection urlConnection = new URL(stream).openConnection();
            urlConnection.connect();
            player = new Player(urlConnection.getInputStream());
            player.play();

            return null;
        }
    };
    worker.execute();
}

}
有人能把这个放到Eclipse中测试一下,看看我在说什么吗。您还需要在以下位置找到JLayer库:


谢谢。

你必须阻止玩家,而不是工人。大概是这样的:

import java.awt.event.ActionEvent;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import javax.swing.*;

public class FooPlayer extends JPanel {
   private PlayerAction[] actions = {
         new PlayerAction(this, "Police",
               "http://relay.broadcastify.com:80/il_chicago_police2"),
         new PlayerAction(this, "Fire", "http://relay.broadcastify.com:80/836454979") };

   public FooPlayer() {
      for (PlayerAction action : actions) {
         add(new JButton(action));
      }
   }

   public PlayerAction[] getActions() {
      return actions;
   }

   private static void createAndShowGui() {
      FooPlayer mainPanel = new FooPlayer();

      JFrame frame = new JFrame("FooPlayer");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class PlayerAction extends AbstractAction {
   private String path;
   private PlayerWorker playerWorker;
   private FooPlayer fooPlayer;

   public PlayerAction(FooPlayer fooPlayer, String name, String path) {
      super(name);
      this.path = path;
      this.fooPlayer = fooPlayer;
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      for (PlayerAction action : fooPlayer.getActions()) {
         action.closePlayer();
      }

      try {
         URLConnection urlConnection = new URL(path).openConnection();
         playerWorker = new PlayerWorker(urlConnection);
         playerWorker.execute();

      } catch (MalformedURLException e1) {
         e1.printStackTrace();
      } catch (IOException e1) {
         e1.printStackTrace();
      }
   }

   private void closePlayer() {
      if (playerWorker != null) {
         playerWorker.closePlayer();
      }
   }
}

class PlayerWorker extends SwingWorker<Void, Void> {
   private Player player;

   public PlayerWorker(URLConnection urlConnection) throws IOException {
      urlConnection.connect();
      player = new Player(urlConnection.getInputStream());
   }

   @Override
   protected Void doInBackground() throws Exception {
      player.play();
      return null;
   }

   public void closePlayer() {
      if (player != null) {
         player.close();
      }
   }
}
导入java.awt.event.ActionEvent;
导入java.io.IOException;
导入java.io.InputStream;
导入java.net.MalformedURLException;
导入java.net.URL;
导入java.net.URLConnection;
导入javax.swing.*;
公共类FooPlayer扩展了JPanel{
private PlayerAction[]操作={
新玩家行动(这是“警察”,
"http://relay.broadcastify.com:80/il_chicago_police2"),
新游戏动作(这是“火”http://relay.broadcastify.com:80/836454979") };
公共足球运动员(){
用于(播放动作:动作){
添加(新JButton(action));
}
}
public PlayerAction[]getActions(){
返回动作;
}
私有静态void createAndShowGui(){
FooPlayer主面板=新建FooPlayer();
JFrame=新JFrame(“FooPlayer”);
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.getContentPane().add(主面板);
frame.pack();
frame.setLocationByPlatform(真);
frame.setVisible(true);
}
公共静态void main(字符串[]args){
SwingUtilities.invokeLater(新的Runnable(){
公开募捐{
createAndShowGui();
}
});
}
}
类PlayerAction扩展了AbstractAction{
私有字符串路径;
私人玩家玩家玩家玩家玩家玩家;
私人足球运动员;
publicplayerAction(FooPlayer、字符串名称、字符串路径){
超级(姓名);
this.path=path;
this.fooPlayer=fooPlayer;
}
@凌驾
已执行的公共无效操作(操作事件e){
for(PlayerAction操作:fooPlayer.getActions()){
action.closePlayer();
}
试一试{
URLConnection URLConnection=新URL(路径).openConnection();
playerWorker=新的playerWorker(urlConnection);
playerWorker.execute();
}捕获(格式错误的异常e1){
e1.printStackTrace();
}捕获(IOE1异常){
e1.printStackTrace();
}
}
私人玩家(){
if(playerWorker!=null){
playerWorker.closePlayer();
}
}
}
类PlayerWorker扩展SwingWorker{
私人玩家;
公共PlayerWorker(URLConnection URLConnection)引发IOException{
urlConnection.connect();
player=新播放器(urlConnection.getInputStream());
}
@凌驾
受保护的Void doInBackground()引发异常{
player.play();
返回null;
}
公共播放器(){
如果(玩家!=null){
player.close();
}
}
}

关键是必须停止正在运行的玩家,而不是将自行停止的SwingWorker,而是SwingWorker正在运行的玩家对象。

为了现在帮助我们,将来帮助你自己,请编辑代码并更改变量名以符合Java命名约定:所有类名都以大写字母开头,方法/变量名以小写字母开头。所以你的
stream
类应该是不同的,可能是
PlayerStream
或者类似的。Player类是否有
cancel()
stop()
方法?我会为每个按钮提供自己的PlayerStream对象,并在尝试启动自己的新PlayerStream之前尝试取消任何打开的PlayerStream的播放。不,您不会取消工作进程,您必须对当前正在播放的Player对象调用close()。你应该给你的SwingWorker一个方法,比如调用
close()
,关闭它当前正在播放的播放器。@user3080860,直到你真正展示你所尝试的……我在你的代码中没有看到
SwingWorker::cancel
。我也看不出你在哪里阻止球员。我甚至不知道您在哪里向
JFrame
添加内容,您的主要方法只是将500x500变为空
JFrame
。如果你不给我们看,我们怎么知道你试过什么?-谢谢。最后我们终于到了那里。
import java.awt.event.ActionEvent;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.net.URL;
import java.net.URLConnection;

import javax.swing.*;

public class FooPlayer extends JPanel {
   private PlayerAction[] actions = {
         new PlayerAction(this, "Police",
               "http://relay.broadcastify.com:80/il_chicago_police2"),
         new PlayerAction(this, "Fire", "http://relay.broadcastify.com:80/836454979") };

   public FooPlayer() {
      for (PlayerAction action : actions) {
         add(new JButton(action));
      }
   }

   public PlayerAction[] getActions() {
      return actions;
   }

   private static void createAndShowGui() {
      FooPlayer mainPanel = new FooPlayer();

      JFrame frame = new JFrame("FooPlayer");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class PlayerAction extends AbstractAction {
   private String path;
   private PlayerWorker playerWorker;
   private FooPlayer fooPlayer;

   public PlayerAction(FooPlayer fooPlayer, String name, String path) {
      super(name);
      this.path = path;
      this.fooPlayer = fooPlayer;
   }

   @Override
   public void actionPerformed(ActionEvent e) {
      for (PlayerAction action : fooPlayer.getActions()) {
         action.closePlayer();
      }

      try {
         URLConnection urlConnection = new URL(path).openConnection();
         playerWorker = new PlayerWorker(urlConnection);
         playerWorker.execute();

      } catch (MalformedURLException e1) {
         e1.printStackTrace();
      } catch (IOException e1) {
         e1.printStackTrace();
      }
   }

   private void closePlayer() {
      if (playerWorker != null) {
         playerWorker.closePlayer();
      }
   }
}

class PlayerWorker extends SwingWorker<Void, Void> {
   private Player player;

   public PlayerWorker(URLConnection urlConnection) throws IOException {
      urlConnection.connect();
      player = new Player(urlConnection.getInputStream());
   }

   @Override
   protected Void doInBackground() throws Exception {
      player.play();
      return null;
   }

   public void closePlayer() {
      if (player != null) {
         player.close();
      }
   }
}