java动画声音播放不正常

时间:2012-02-16 17:09:40

标签: java swing audio javasound

球在无限循环中上下移动。声音应该适用于每个动作。但它每5-6次运动就会被播放。为什么会这样?声音持续时间不到1秒。在代码中,在循环的每次迭代中都有一个3秒的休眠时间。但是,将睡眠持续时间改为6秒,可达到所需的效果。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import sun.audio.*;
import java.io.*;

public class dabble {

private boolean z=false;
private int x=10;
private int y=10;
private JFrame frame;
private JLabel label;
private mypanel panel;
private JButton b1;
private JButton b2;

public static void main (String[] args) throws Exception
{
    dabble dab = new dabble();
    dab.start();
}

void start()
{
    frame = new JFrame();
    label = new JLabel();
    panel = new mypanel();
    b1= new JButton("Start");
    b2= new JButton("Stop");

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    b1.addActionListener(new al1());
    b2.addActionListener(new al2());

    frame.getContentPane().add(BorderLayout.NORTH,b1);
    frame.getContentPane().add(BorderLayout.SOUTH,b2);
    frame.getContentPane().add(BorderLayout.CENTER,panel);
    frame.getContentPane().add(BorderLayout.EAST,label);
    frame.setSize(600,600);
    frame.setVisible(true);
}

class al1 implements ActionListener{
    public void actionPerformed(ActionEvent event){
        if (z==false)
        {
            class myrun implements Runnable{
                public void run(){
                    z=true;
                    while(z==true)
                    {
                        y=510-y;
                        panel.repaint();
                        try
                        {
                            InputStream in=new FileInputStream("hit.wav");
                            AudioStream as=new AudioStream(in);
                            AudioPlayer.player.start(as);
                            Thread.sleep(3000);
                        }
                        catch(Exception Ex){}
                    }
                }
            }

            Runnable myjob = new myrun();
            Thread mythread = new Thread(myjob);
            mythread.start();

        }
    }
}

class al2 implements ActionListener{
    public void actionPerformed(ActionEvent event){
        z=false;
    }
}

class mypanel extends JPanel {
    public void paintComponent ( Graphics g){
        g.setColor(Color.white);
        g.fillRect(0,0,this.getWidth(),this.getHeight());
        int red = (int) (Math.random()*255);
        int green = (int) (Math.random()*255);
        int blue = (int) (Math.random()*255);
        Color c1 = new Color(red,green,blue);
        g.setColor(c1);
        g.fillOval(x,y,20,20);
    }
}
}

3 个答案:

答案 0 :(得分:1)

  1. Clip页上所示的JavaSound info.加载声音。
  2. Clip提供loop(int)方法来指定播放的时间。

答案 1 :(得分:0)

我要改变的一件事是在while循环中加载音频文件。这可能是一个漫长的操作,搞乱时间。

AudioStream as添加为al1类的私有成员变量,并在构造函数中初始化它。然后,每次循环迭代时,您已经准备好了流,您可以直接播放它。

答案 2 :(得分:0)

当我将sleep命令移动到try块之外但仍在while循环内时,循环所用的时间仍有一些不均匀,但至少球和声音保持同步。

但是,真的很奇怪。我无法弄清楚为什么睡眠安置很重要。就像在try块中的睡眠一样,直到新的重绘发生之后才会执行,从而保持下一个游戏?但那怎么可能呢?