Java - 使用资源(图像和音频文件)导出到eclipse中的JAR文件

时间:2017-01-31 19:20:10

标签: java eclipse image audio jar

我在Linux Ubuntu上使用eclipse,我有这个代码用于加载图像并将其设置为我的一个JPanels中的背景:

public class MenuState extends JPanel implements ActionListener {

private static final long serialVersionUID = 1L;
private GameStateManager gsm;
private int width;
private int height;

public MenuState(GameStateManager gsm)
{
    this.gsm = gsm;
    width = gsm.getWidth();
    height = gsm.getHeight();
    SizeManager sm = new SizeManager();
    this.setLayout(new BorderLayout());
    sm.set_size(this, width, height);
}

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

    BufferedImage background_image;
    try {
        background_image = ImageIO.read(new File("src/res/img/menu_background.png"));
        g.drawImage(background_image, 0, 0, width, height, null);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void actionPerformed(ActionEvent e) {
}

它只适用于eclipse。当我将它导出到jar文件或runnable jar文件程序时不显示图像。我也尝试过使用

this.getClass().getResource()

和类似的代码但它在eclipse中不起作用。但我可能做错了。

我在另一个类中也有这个代码来播放音频:

public class AudioManager {

private Clip clip;

public void play(String audio_name, boolean repeat)
{   
    try {
        File audioFile = new File(audio_name);
        AudioInputStream audioStream = AudioSystem.getAudioInputStream(audioFile);
        AudioFormat format = audioStream.getFormat();
        DataLine.Info info = new DataLine.Info(Clip.class, format);
        clip = (Clip) AudioSystem.getLine(info);
        clip.open(audioStream);
        if(repeat)
        {
            clip.loop(clip.LOOP_CONTINUOUSLY);
        }
        clip.start();

    } catch (Exception e) {
        e.printStackTrace();
    }
}

public void stop()
{
    clip.stop();
}

它在eclipse中播放音频,但在导出项目后却没有。

我认为File只适用于磁盘上的文件而不适用于jar文件中的文件,但这只是我在eclipse中使用它的方式。

那么,我该怎么办?

还有其他问题: 在eclipse中播放的声音是滞后的,我改进了它增加eclipse的可用内存,但是在加载程序和通过点击JButtons更改JFrame中的JPanels时会出现一些滞后。

感谢您的任何建议。

1 个答案:

答案 0 :(得分:0)

你在getResource方法中添加了什么字符串? 使用getResourcegetResourceAsStream时,必须指定包路径。如果您的文件位于" com.test.example"包中,则必须添加getResource("/com/test/example/my_file.png")

因此,使用背景图片,您必须使用以下内容加载图片:

background_image = ImageIO.read(this.getClass().getResource("/res/img/menu_background.png"));

您应该对音频文件采取相同的方式。

我还建议您在paintComponent方法之外加载图片。否则,每次重新绘制面板时,都会重新加载图像。