回答編集履歴

2

追加

2024/02/15 08:42

投稿

jimbe
jimbe

スコア12719

test CHANGED
@@ -10,3 +10,97 @@
10
10
  ```
11
11
  で (src フォルダは入っていないことが) 確認出来ます。
12
12
  (Swing とは関係無いことですので、それらのコードを無くした最小のコードで試すのがコツかと思います。)
13
+
14
+ ---
15
+ クラス名や構造を少し変更してみました。(wavファイル名もこちらに有ったものしていますのでご注意を。)
16
+ ```java
17
+ import java.awt.FlowLayout;
18
+ import java.io.File;
19
+ import java.util.List;
20
+
21
+ import javax.sound.sampled.*;
22
+ import javax.swing.*;
23
+
24
+ public class MusicFrame extends JFrame {
25
+ public static void main(String[] args) throws Exception {
26
+ File file = new File("musicbox.wav");
27
+ if(!file.exists()) {
28
+ System.out.println("ファイルが見つかりませんでした。");
29
+ System.exit(1);
30
+ }
31
+
32
+ try(AudioInputStream stream = AudioSystem.getAudioInputStream(file);) {
33
+ Clip clip = (Clip)AudioSystem.getLine(new DataLine.Info(Clip.class, stream.getFormat()));
34
+ clip.open(stream);
35
+
36
+ new MusicFrame(clip).setVisible(true);
37
+ }
38
+ }
39
+
40
+ MusicFrame(Clip clip) {
41
+ super("ClipPlayer2");
42
+ setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
43
+ setSize(350, 100);
44
+ setLocationRelativeTo(null);
45
+
46
+ int maxLength = clip.getFrameLength() - 1;
47
+
48
+ setLayout(new FlowLayout());
49
+
50
+ JButton playButton = new JButton("再生");
51
+ add(playButton);
52
+
53
+ JButton stopButton = new JButton("停止");
54
+ stopButton.setEnabled(false);
55
+ add(stopButton);
56
+
57
+ JLabel counterLabel = new JLabel("0");
58
+ add(counterLabel);
59
+
60
+ JProgressBar pBar = new JProgressBar(0, maxLength);
61
+ add(pBar);
62
+
63
+ playButton.addActionListener(e -> {
64
+ playButton.setEnabled(false);
65
+ stopButton.setEnabled(true);
66
+
67
+ if(clip.isRunning()) clip.stop();
68
+ clip.setFramePosition(0);
69
+ clip.start();
70
+ });
71
+
72
+ stopButton.addActionListener(e -> {
73
+ playButton.setEnabled(true);
74
+ stopButton.setEnabled(false);
75
+ clip.stop();
76
+ });
77
+
78
+ clip.addLineListener(e -> {
79
+ if(e.getType() == LineEvent.Type.STOP) {
80
+ playButton.setEnabled(true);
81
+ stopButton.setEnabled(false);
82
+ }
83
+ });
84
+
85
+ new SwingWorker<Void,Integer>() {
86
+ @Override
87
+ public Void doInBackground() throws Exception {
88
+ while(true) {
89
+ publish((int)clip.getLongFramePosition());
90
+ try {
91
+ Thread.sleep(500);
92
+ } catch(Exception e) {
93
+ e.printStackTrace();
94
+ }
95
+ }
96
+ }
97
+ @Override
98
+ protected void process(List<Integer> framePosList) {
99
+ int framePos = framePosList.get(framePosList.size()-1); //最後の一個
100
+ counterLabel.setText(framePos + "/" + maxLength);
101
+ pBar.setValue(framePos % (maxLength + 1));
102
+ }
103
+ }.execute();
104
+ }
105
+ }
106
+ ```

1

追記

2024/02/15 07:33

投稿

jimbe
jimbe

スコア12719

test CHANGED
@@ -8,5 +8,5 @@
8
8
  }
9
9
  }
10
10
  ```
11
- で確認出来ます。
11
+ (src フォルダは入っていないことが) 確認出来ます。
12
12
  (Swing とは関係無いことですので、それらのコードを無くした最小のコードで試すのがコツかと思います。)