0

私は時計アプレットを作っていて、ほぼ完成していますが、まだやらなければならないことが 1 つあります。秒針が動くたびに時計を「カチカチ」させたいのですが、「カチカチ」音のコードをどこに置くかわかりません。アプレットのコードは次のとおりです。

import java.applet.*;
import java.awt.*;
import java.util.*;
import java.net.URL;
import java.text.*;

public class ClockApplet extends Applet implements Runnable {
    Ellipse2D line1 = new Ellipse2D.Float(100, 150, 200, 200);

    int width, height;
    Thread t = null;
    boolean threadSuspended;
    int hours = 0, minutes = 0, seconds = 0;
    String timeString = "";

    public void init() {
        width = getSize().width;
        height = getSize().height;
        setBackground(Color.white);
    }

    public void start() {
        if (t == null) {
            t = new Thread(this);
            t.setPriority(Thread.MIN_PRIORITY);
            threadSuspended = false;
            t.start();
        } else {
            if (threadSuspended) {
                threadSuspended = false;
                synchronized (this) {
                    notify();
                }
            }
        }
    }

    public void stop() {
        threadSuspended = true;
    }

    public void run() {
        try {
            while (true) {

                // Here's where the thread does some work:

                Calendar cal = Calendar.getInstance();
                hours = cal.get(Calendar.HOUR_OF_DAY);
                if (hours > 12)
                    hours -= 12;
                minutes = cal.get(Calendar.MINUTE);
                seconds = cal.get(Calendar.SECOND);

                SimpleDateFormat formatter = new SimpleDateFormat("hh:mm:ss",
                        Locale.getDefault());
                Date date = cal.getTime();
                timeString = formatter.format(date);

                // Now the thread checks to see if it should suspend itself
                if (threadSuspended) {
                    synchronized (this) {
                        while (threadSuspended) {
                            wait();
                        }
                    }
                }
                repaint();

                t.sleep(1000); // interval given in milliseconds

            }
        } catch (InterruptedException e) {
        }
    }

    void drawHand(double angle, int radius, Graphics g) {
        angle -= 0.5 * Math.PI;
        int x = (int) (radius * Math.cos(angle));
        int y = (int) (radius * Math.sin(angle));
        g.drawLine(width / 2, height / 2, width / 2 + x, height / 2 + y);
    }

    void drawWedge(double angle, int radius, Graphics g) {
        angle -= 0.5 * Math.PI;
        int x = (int) (radius * Math.cos(angle));
        int y = (int) (radius * Math.sin(angle));
        angle += 2 * Math.PI / 3;
        int x2 = (int) (5 * Math.cos(angle));
        int y2 = (int) (5 * Math.sin(angle));
        angle += 2 * Math.PI / 3;
        int x3 = (int) (5 * Math.cos(angle));
        int y3 = (int) (5 * Math.sin(angle));
        g.drawLine(width / 2 + x2, height / 2 + y2, width / 2 + x, height / 2
                + y);
        g.drawLine(width / 2 + x3, height / 2 + y3, width / 2 + x, height / 2
                + y);
        g.drawLine(width / 2 + x2, height / 2 + y2, width / 2 + x3, height / 2
                + y3);
    }

    void drawCircle(Graphics g) {
        g.drawOval(0, 0, 200, 200);
    }

    public void paint(Graphics g) {
        g.setColor(Color.black);
        drawWedge(2 * Math.PI * hours / 12, width / 5, g);
        drawWedge(2 * Math.PI * minutes / 60, width / 3, g);
        g.setColor(Color.red);
        drawHand(2 * Math.PI * seconds / 60, width / 2, g);
        g.setColor(Color.black);
        g.drawString(timeString + " ET", 10, height - 10);
        g.setFont(new Font("Arial", Font.PLAIN, 30));
        g.drawString("12", 85, 30);
        g.drawString("1", 140, 40);
        g.drawString("2", 170, 70);
        g.drawString("3", 180, 110);
        g.drawString("4", 170, 150);
        g.drawString("5", 140, 180);
        g.drawString("6", 92, 195);
        g.drawString("7", 46, 180);
        g.drawString("8", 16, 150);
        g.drawString("9", 5, 110);
        g.drawString("10", 16, 70);
        g.drawString("11", 46, 40);
        drawCircle(g);
    }

}

そして、これが*カチカチ*音のコードです:

try {
    Clip tick = AudioSystem.getClip();
    URL clipURL = new URL("file://C:/users/owner/desktop/Tick.wav");
    AudioInputStream ais = AudioSystem.getAudioInputStream(clipURL);
    tick.open(ais);
    tick.start();
} catch (Exception e) {
    System.out.println("Error playing sound!");
    }

私が知る必要があるのは、サウンド コードをアプレット コードのどこに置くかだけです。いろいろなところを試してみましたが、うまくいかないようです。

4

1 に答える 1

0

この回答は、JApplets またはアプリケーションに適用されます。(私自身、アプレットを使用したことはありません。)

(1) tick Clip を、最上位クラスがインスタンス化されるときにロードされるインスタンス変数にします。JApplet のコンテキストでは、それは init() メソッドの間です。時計のグラフィックを JComponent または JPanel に表示し、グラフィックのコンテナをインスタンス化するときに Clip をインスタンス化することにより、アプリケーションのコンテキストを作成できます。

(Clip をメモリに繰り返しロードするのは意味がありません!Clip のポイントは、一度実行してから再利用したいときにリセットすることです。繰り返しロードされる Clip は、SourceDataLine よりも再生を開始するのに時間がかかります。再生を開始する前にサウンド ファイル全体をロードする必要があるためです。)

(2) 位置をクリップの開始 (フレーム 0) にリセットしてから再生することで、ティック クリップを実行する新しいスレッドを作成します。

(3) このスレッドは、グラフィックが再描画される while ループから繰り返し起動します。おそらく、スレッドは実行が終了するとすぐに終了します。クリック音が 1 秒より長い場合、バグがある可能性があります。

これが確実に「正しい」と言っているわけではありません。1000 ミリ秒間隔に設定された util.Timer を介して、グラフィックとサウンド スレッドの両方の更新を開始することは理にかなっています。

于 2013-05-17T06:12:09.850 に答える