簡體   English   中英

Java Swing Worker沒有停止

[英]Java Swing Worker not stopping

我正在使用Java swing構建應用程序。 該應用程序基本上是從Broadcastify網站獲取警察廣播流並播放它們。

此刻的應用程序有兩個按鈕:“芝加哥警察”,“芝加哥消防和EMS”。 當按下芝加哥警察按鈕時,芝加哥警察流開始播放。 但是,當按下相同的按鈕或不同的按鈕時,流不會停止,而只會播放自己。 我認為這與SwingWorker有關。

基本上,我要執行的操作是播放一個流,並在按下另一個流按鈕時,停止當前流,然后開始新的流。

我嘗試使用.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();
}

}

主類:

import javax.swing.JFrame;

public class main {

public static void main(String[] args) {

    frame f = new frame();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setSize(500,500);
    f.setResizable(false);
    f.setLocationRelativeTo(null);
    f.setVisible(true);
}

}

有人可以將其放入Eclipse並對其進行測試以查看我在說什么。 您還將需要在這里找到JLayer庫: http : //www.javazoom.net/javalayer/javalayer.html

謝謝。

您必須停止播放器,而不是工人。 像這樣:

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();
      }
   }
}

關鍵是必須停止正在運行的Player,而不是SwingWorker(后者會自行停止),而是要停止SwingWorker正在運行的Player對象。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM