さまざまな間隔を使用してループ内の名前のリストを更新する宝くじプログラムに取り組んでいます。更新ごとに、短い (300 ミリ秒) の click.wav を再生したいと考えています。Netbeans でプログラムを実行すると、すべてが完全に機能しますが、jar をビルドすると、再生が拒否されます。奇妙なことに、最後に無音を追加してサウンドを数秒長くすると、再生されますが、タイミングがすべてずれ、ループが 4 ~ 5 回実行された後にのみ再生が開始されます。
ループ間の一時停止を開始するために、thread.sleep() を使用しています。これは最善の方法ではないかもしれませんが、確かに最も簡単であり、このプログラムの範囲には関係ありません。タイマーを使ってみたのですが、音が出ません。
これは、wav ファイルを再生するための私のコードです。
private static void play(String filename) {
URL url = VinLotteri.class.getResource(filename);
try {
Clip clip = AudioSystem.getClip();
clip.open(AudioSystem.getAudioInputStream(url));
clip.start();
} catch (LineUnavailableException | UnsupportedAudioFileException | IOException fail) {
}
}
そして、これがループコードです。問題に関係のない悪いコードは無視してください (または建設的な批判をしてください)。私はプログラミングを始めて数か月しか経っていないので、おそらくそのようなことがたくさんあります。
class StartTrekning extends SwingWorker<String, String> {
private StartTrekning(List<String> navn, String vinner) {
}
@Override
protected String doInBackground() {
firstDraw = false;
Random rnd = new Random();
int v = 0;
int vinnerID = -1;
isRunning = true;
int counterPluss = 0;
int counterMinus = 0;
int rand = rnd.nextInt(17) + 45; // Antall trekninger 45-61
//Setter opp ulik pause mellom hver trekning
for (int i = rand; i > 0; i--) {
if (i > 40) {
v = 100;
} else if (i > 35) {
v = 150;
} else if (i > 25) {
v = 200;
} else if (i > 20) {
v = 250;
} else if (i > 15) {
v = 300;
} else if (i > 10) {
v = 400;
} else if (i > 6) {
v = 550;
} else if (i > 3) {
v = 800;
} else if (i > 1) {
v = 1200;
} else if (i > 0 && rand > 53) {
v = 2000;
}
play(click);
vinnerID++;//Øker vinnerID, som gir index for navnelisten navn
//"Loop-kode" (starter listen på nytt når den når slutten)
if (vinnerID > navn.size() - 1) {
vinnerID = 0;
}
vinner = navn.get(vinnerID);
int pluss10 = vinnerID;
int pluss9 = vinnerID;
int pluss8 = vinnerID;
int pluss7 = vinnerID;
int pluss6 = vinnerID;
int pluss5 = vinnerID;
int pluss4 = vinnerID;
int pluss3 = vinnerID;
int pluss2 = vinnerID;
int pluss1 = vinnerID;
int minus1 = vinnerID;
int minus2 = vinnerID;
int minus3 = vinnerID;
if (vinnerID > navn.size() - 11) {
pluss10 = -10 + counterPluss;
}
if (vinnerID > navn.size() - 10) {
pluss9 = -10 + counterPluss;
}
if (vinnerID > navn.size() - 9) {
pluss8 = -10 + counterPluss;
}
if (vinnerID > navn.size() - 8) {
pluss7 = -10 + counterPluss;
}
if (vinnerID > navn.size() - 7) {
pluss6 = -10 + counterPluss;
}
if (vinnerID > navn.size() - 6) {
pluss5 = -10 + counterPluss;
}
if (vinnerID > navn.size() - 5) {
pluss4 = -10 + counterPluss;
}
if (vinnerID > navn.size() - 4) {
pluss3 = -10 + counterPluss;
}
if (vinnerID > navn.size() - 3) {
pluss2 = -10 + counterPluss;
}
if (vinnerID > navn.size() - 2) {
pluss1 = -10 + counterPluss;
counterPluss = 0;
}
if (vinnerID < 3) {
minus3 = navn.size() + counterMinus;
}
if (vinnerID < 2) {
minus2 = navn.size() + counterMinus;
}
if (vinnerID < 1) {
minus1 = navn.size() + counterMinus;
}
if (vinnerID < 3) {
counterMinus++;
}
if (vinnerID == 3) {
counterMinus = 0;
}
if (vinnerID > navn.size() - 11) {
counterPluss++;
}
//Slutt på "loop-kode"
// Lager "rulleteksten"
lblVinner.setText(vinner);
lblHighlight1.setText(navn.get(minus1 - 1));
lblHighlight2.setText(navn.get(minus2 - 2));
lblHighlight3.setText(navn.get(minus3 - 3));
lblHighlight7.setText(navn.get(pluss1 + 1));
lblHighlight8.setText(navn.get(pluss2 + 2));
lblHighlight9.setText(navn.get(pluss3 + 3));
lblHighlight10.setText(navn.get(pluss4 + 4));
lblHighlight11.setText(navn.get(pluss5 + 5));
lblHighlight12.setText(navn.get(pluss6 + 6));
lblHighlight13.setText(navn.get(pluss7 + 7));
lblHighlight4.setText(navn.get(pluss8 + 8));
lblHighlight5.setText(navn.get(pluss9 + 9));
lblHighlight6.setText(navn.get(pluss10 + 10));
try {
Thread.sleep(v);
} catch (InterruptedException ex) {
Logger.getLogger(VinLotteri.class.getName()).log(Level.SEVERE, null, ex);
}
}
int rand1 = rnd.nextInt(100);
//Legger inn en liten kunstpause
if (rand1 < 50) {
try {
Thread.sleep(v);
} catch (InterruptedException ex) {
Logger.getLogger(VinLotteri.class.getName()).log(Level.SEVERE, null, ex);
}
}
panelVinner.append(idVinn + ". Trekning: " + vinner + "\n"); //Skriver ut vinneren
play(fanfare);
flashText(lblVinner, Color.WHITE, Color.BLUE, 270, 1650);
vinnere.add(vinner); //Lager vinnerliste
idVinn++;
nyListe(vinnerID, vinner);
isRunning = false;
return null;
}
どんな助けでも大歓迎です。ありがとうございました。