- 締切済み
スレッドの自動終了について。
スレッドの自動終了について。 クリップをファイルから取得し、[1]キーが押されるとクリップが再生され、クリップ再生中の場合は ファイル名を表示したラベルに色を着けるプログラムを作ってみたのですが 1度のみなら正しく作動するのですが、2回目にキーを押そうとすると、クリップだけ再生しラベルの色は黒いままです。 そして、3回目以降はキーをいくら押してもクリップが再生されません。 これを正しく動作させるにはどのようにしたらよいでしょうか。 キーリスナ、スレッド、アクションリスナの内容を記載しますので、ご指導頂けたらと思います。 class ClipWatching extends Thread { public ClipWatching() { } public void run() { while(clip1.isRunning()) { lb1.setForeground(Color.red); } lb1.setForeground(Color.black); thread = false; } } class SampleKeyListener implements KeyListener { public void keyPressed(KeyEvent e) { if(e.getKeyCode() == KeyEvent.VK_1) { try{ if(thread == false) { cw.join(); } clip1.start(); cw.start(); thread = true; } catch(Exception uu) { } } } public void keyReleased(KeyEvent e){ } public void keyTyped(KeyEvent e){ } } class SampleActionListener implements ActionListener { public void shori() { } public void actionPerformed(ActionEvent e) { try { if(e.getSource() == bt1) { fl1 = new File("001.wav"); lb1.setText(fl1 + ""); ais1 = AudioSystem.getAudioInputStream(fl1); format1 = ais1.getFormat(); info1 = new DataLine.Info(Clip.class, format1); clip1 = (Clip) AudioSystem.getLine(info1); clip1.open(ais1); } } catch(Exception ex) { } }
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- tom11
- ベストアンサー率53% (134/251)
なんかよく解らないので、wavファイルを鳴らし、プログレスバーで 進捗を表してみました。 スレット処理もしています。 ボタンを押せば、何回も繰り返します。 アプレットなく、JFrameを利用しています。自分用に 応用してみてださい。 public class wave_file extends javax.swing.JFrame { Thread th = null; Runnable rn = null; long filelong =0; long filebyte =0; /** Creates new form wave_file */ public wave_file() { initComponents(); rn = new Runnable() { public void run() { try { File fn = new File("\hamazaki.WAV"); filelong = fn.length(); AudioInputStream ais = AudioSystem.getAudioInputStream(fn); AudioFormat af = ais.getFormat(); DataLine.Info info = new DataLine.Info(SourceDataLine.class, af); SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info); line.open(af); line.start(); int nbr = 0; byte[] data = new byte[128000]; filebyte = 0; while (nbr != -1) { nbr = ais.read(data, 0, data.length); filebyte = filebyte + data.length; jProgressBar1.setValue((int) ((double)filebyte /(double)filelong * 100.0)); if (nbr >= 0) { int nbw = line.write(data, 0, nbr); } } line.drain(); line.close(); } catch (UnsupportedAudioFileException unsupportedAudioFileException) { unsupportedAudioFileException.printStackTrace(); } catch (IOException iOException) { iOException.printStackTrace(); } catch (LineUnavailableException lineUnavailableException) { lineUnavailableException.printStackTrace(); } } }; } @SuppressWarnings("unchecked") // <editor-fold defaultstate="collapsed" desc="Generated Code"> private void initComponents() { jButton1 = new javax.swing.JButton(); jProgressBar1 = new javax.swing.JProgressBar(); setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); getContentPane().setLayout(null); jButton1.setText("jButton1"); jButton1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jButton1ActionPerformed(evt); } }); getContentPane().add(jButton1); jButton1.setBounds(282, 248, 75, 21); jProgressBar1.setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR)); getContentPane().add(jProgressBar1); jProgressBar1.setBounds(51, 72, 146, 19); pack(); }// </editor-fold> private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { th = new Thread(rn); th.start(); // TODO add your handling code here: } public static void main(String args[]) { java.awt.EventQueue.invokeLater(new Runnable() { public void run() { new wave_file().setVisible(true); } }); } // Variables declaration - do not modify private javax.swing.JButton jButton1; private javax.swing.JProgressBar jProgressBar1; // End of variables declaration }