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