java动画声音播放不正常
一个球在无限循环中上下移动。声音应该为每个动作播放。但是每5-6个动作就播放一次。为什么会这样?声音持续时间小于1秒。在代码中,循环的每次迭代都有3秒钟的睡眠时间。但是,将睡眠持续时间更改为6秒,可以达到所需的效果java动画声音播放不正常,java,swing,audio,javasound,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 boolea
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);
}
}
}
我要改变的一件事是在while循环中加载音频文件。这可能是一个漫长的操作,会打乱时间安排
将
AudioStream添加为al1
类的私有成员变量,并在构造函数中初始化它。然后,每次循环迭代时,您就已经准备好播放流了。我要更改的一件事是在while循环中加载音频文件。这可能是一个漫长的操作,会打乱时间安排
将AudioStream添加为al1
类的私有成员变量,并在构造函数中初始化它。然后,每次循环迭代时,您就已经准备好了流,可以直接播放它了
如页面所示,在a中加载声音
Clip提供了一种指定播放时间的方法
如页面所示,在a中加载声音
Clip提供了一种指定播放时间的方法
当我将sleep命令移到try块外,但仍在while循环内时,循环所需的时间仍然不均匀,但至少球和声音保持同步
不过真的很奇怪。我不明白为什么睡眠的位置很重要。这就好像在try块中的睡眠直到新的重新绘制发生后才被执行,从而阻止了下一个播放?但是这怎么可能呢?当我将sleep命令移到try块之外,但仍然在while循环中时,循环所需的时间仍然不均匀,但至少球和声音保持同步
不过真的很奇怪。我不明白为什么睡眠的位置很重要。这就好像在try块中的睡眠直到新的重新绘制发生后才被执行,从而阻止了下一个播放?但是这怎么可能呢?我试着运行代码,但是使用javax.sound.sampled SourceDataLine,得到了相同的错误。将代码移动到构造函数没有多大帮助。有时声音还是很晚才出现,虽然有时声音范围降到30分之一。非常奇怪。我试着运行代码,但是使用javax.sound.sampled SourceDataLine,得到了相同的错误。将代码移动到构造函数没有多大帮助。有时声音还是很晚才出现,虽然有时声音范围降到30分之一。很奇怪,这不起作用,而且这个动作变得随机,声音不播放,这不起作用,而且这个动作变得随机,声音不播放