// -*- mode:java; encoding:utf-8 -*-
// vim:set fileencoding=utf-8:
// @homepage@

package example;

import java.awt.*;
import java.io.IOException;
import java.util.Objects;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.Clip;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.LineEvent;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.UnsupportedAudioFileException;
import javax.swing.*;

public final class MainPanel extends JPanel {
  private MainPanel() {
    super(new BorderLayout());

    JButton b1 = new JButton("play");
    b1.addActionListener(e -> loadAndPlayAudio("notice1.wav"));

    JButton b2 = new JButton("play");
    b2.addActionListener(e -> loadAndPlayAudio("notice2.wav"));

    Box box = Box.createVerticalBox();
    box.setBorder(BorderFactory.createEmptyBorder(5, 5, 5, 5));
    box.add(makeTitledPanel("notice1.wav", b1));
    box.add(Box.createVerticalStrut(5));
    box.add(makeTitledPanel("notice2.wav", b2));

    add(box, BorderLayout.NORTH);
    setPreferredSize(new Dimension(320, 240));
  }

  public void loadAndPlayAudio(String path) {
    try (AudioInputStream sound = AudioSystem.getAudioInputStream(getClass().getResource(path));
         Clip clip = (Clip) AudioSystem.getLine(new DataLine.Info(Clip.class, sound.getFormat()))) {
      SecondaryLoop loop = Toolkit.getDefaultToolkit().getSystemEventQueue().createSecondaryLoop();
      clip.addLineListener(e -> {
        LineEvent.Type t = e.getType();
        if (Objects.equals(t, LineEvent.Type.STOP) || Objects.equals(t, LineEvent.Type.CLOSE)) {
          loop.exit();
        }
      });
      clip.open(sound);
      clip.start();
      loop.enter();
    } catch (UnsupportedAudioFileException | IOException | LineUnavailableException ex) {
      ex.printStackTrace();
      Toolkit.getDefaultToolkit().beep();
    }
  }

  private static Component makeTitledPanel(String title, Component c) {
    JPanel p = new JPanel(new BorderLayout());
    p.setBorder(BorderFactory.createTitledBorder(title));
    p.add(c);
    return p;
  }

  public static void main(String[] args) {
    EventQueue.invokeLater(MainPanel::createAndShowGui);
  }

  private static void createAndShowGui() {
    try {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
      ex.printStackTrace();
      Toolkit.getDefaultToolkit().beep();
    }
    JFrame frame = new JFrame("@title@");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.getContentPane().add(new MainPanel());
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}

@@ -133,32 +133,53 @@
 io.IOException;%0A
+import java.net.URL;%0A
 import java.util
@@ -612,25 +612,24 @@
 rLayout());%0A
-%0A
     JButton 
@@ -698,24 +698,32 @@
 dPlayAudio(%22
+example/
 notice1.wav%22
@@ -813,16 +813,24 @@
 yAudio(%22
+example/
 notice2.
@@ -1209,24 +1209,147 @@
 ing path) %7B%0A
+    URL url = Thread.currentThread().getContextClassLoader().getResource(path);%0A    if (url == null) %7B%0A      return;%0A    %7D%0A
     try (Aud
@@ -1362,21 +1362,19 @@
 tStream 
-sound
+wav
  = Audio
@@ -1404,36 +1404,11 @@
 eam(
-getClass().getResource(path)
+url
 );%0A 
@@ -1484,21 +1484,19 @@
 .class, 
-sound
+wav
 .getForm
@@ -1835,21 +1835,19 @@
 ip.open(
-sound
+wav
 );%0A     

argument 'getClass().getResource(...)' might be null