Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
java动画声音播放不正常_Java_Swing_Audio_Javasound - Fatal编程技术网

java动画声音播放不正常

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

一个球在无限循环中上下移动。声音应该为每个动作播放。但是每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);
    }
}
}

我要改变的一件事是在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分之一。很奇怪,这不起作用,而且这个动作变得随机,声音不播放,这不起作用,而且这个动作变得随机,声音不播放