[英]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.