Java swing を使用してアプリケーションを構築しています。このアプリケーションは基本的に、Broadcastify Web サイトから警察のラジオ ストリームを取得して再生します。
分のアプリケーションには、「シカゴ警察」、「シカゴ消防とEMS」の2つのボタンがあります。シカゴ警察のボタンを押すと、シカゴ警察のストリームが再生されます。ただし、同じボタンまたは別のボタンが押された場合、ストリームは停止せず、そのまま再生されます。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
ありがとう。