图像和声音不会同时加载(Java)

时间:2012-01-28 15:59:42

标签: java image audio

我正在制作一款使用声音和图像的游戏。最奇怪的事情正在发生。加载声音时,我的图像不会出现。但是,当我不加载声音时,我的图像确实出现了。这是我的代码:

package com.gbp.chucknorris;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.AbstractAction;
import javax.swing.ActionMap;
import javax.swing.InputMap;
import javax.swing.JPanel;
import javax.swing.KeyStroke;

public class Title extends JPanel implements Runnable {
    private static final long serialVersionUID = 1L;
    public Thread thread;
    private BufferedImage logo;
    private Clip clip, titleClip;

    public Title() {
        super();
        loadSound();
        loadImages();
        bind();
        setBackground(Color.WHITE);
    }

    private void loadSound() {
        File f = new File("res/sounds/title.wav");
        AudioInputStream stream = null;
        try {
            stream = AudioSystem.getAudioInputStream(f);
        } catch (UnsupportedAudioFileException | IOException e) {
            e.printStackTrace();
        }
        DataLine.Info info = new DataLine.Info(Clip.class, stream.getFormat());
        try {
            clip = (Clip) AudioSystem.getLine(info);
        } catch (LineUnavailableException e) {
            e.printStackTrace();
        }
        try {
            clip.open(stream);
        } catch (LineUnavailableException | IOException e) {
            e.printStackTrace();
        }

        File title = new File("res/sounds/theme.wav");
        AudioInputStream titleStream = null;
        try {
            titleStream = AudioSystem.getAudioInputStream(title);
        } catch (UnsupportedAudioFileException | IOException e) {
            e.printStackTrace();
        }
        DataLine.Info titleInfo = new DataLine.Info(Clip.class, titleStream.getFormat());
        try {
            titleClip = (Clip) AudioSystem.getLine(titleInfo);
            titleClip.open(titleStream);
        } catch (LineUnavailableException | IOException e) {
            e.printStackTrace();
        }
        titleClip.loop(Clip.LOOP_CONTINUOUSLY);
    }

    private void bind() {
        InputMap im = getInputMap();
        ActionMap am = getActionMap();

        im.put(KeyStroke.getKeyStroke("DOWN"), "down");
        am.put("down", new AbstractAction() {
            private static final long serialVersionUID = 1L;

            @Override
            public void actionPerformed(ActionEvent e) {

            }
        });
    }

    private void loadImages() {
        try {
            logo = ImageIO.read(new File("res/pics/MenuPanel.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public void run() {
        while (true) {
            repaint();
        }
    }

    public void addNotify() {
        super.addNotify();
        thread = new Thread(this);
        thread.start();
    }

    public void paint(Graphics g) {
        super.paint(g);

        g.drawImage(logo, 0, 0, null);
    }
}

提前致谢!

1 个答案:

答案 0 :(得分:2)

您需要学习使用背景线程(如SwingWorker),以便在加载和播放声音时不占用事件线程(EDT)。您可以在此处了解如何使用此功能:Lesson: Concurrency in Swing

编辑:我不建议这样做:

@Override
public void run() {
    while (true) {
        repaint();
    }
}