Изображения и звук не загружаются одновременно (Java) - PullRequest
1 голос
/ 28 января 2012

Я делаю игру, которая использует звук и изображения.Странная вещь происходит.Когда я загружаю звук, мое изображение не появляется.Однако, когда я не загружаю свой звук, мое изображение появляется.Вот мой код:

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 Ответ

2 голосов
/ 28 января 2012

Вам необходимо научиться использовать фоновые потоки, такие как SwingWorker, чтобы не связывать поток событий, EDT, при загрузке и воспроизведении звуков. Вы можете прочитать о том, как использовать это здесь: Урок: параллелизм в Swing .

Редактировать: я бы не рекомендовал делать это:

@Override
public void run() {
    while (true) {
        repaint();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...