Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
ich habe einen button und wenn ich sehr häufig draufdrücke, wird die reaktion langsamer. (Häufig draufdrücken heißt schon fast pausenlos draufclicken 15-25 sek)
wenn ich nun wie gewollt einen Sound drauflege tritt das noch eher auf. (nach 7-10 mal klicken)
das ganze muss aber später funktionieren, da ich einen drum computer bauen will, und da häufiges raufklicken auf einen button unerlässlich ist..
das ganze passiert erst nachdem es als jar file exportiert wurde.
Und was macht der Button? Vielleicht Speicher belegen und nie wieder freigeben? Das waere so die Standard-Erklaerung. Oder Threads starten die in einem Unendlich-Loop haengen bleiben.
Kannst mal versuchen, für jeden gedrückten Schalter einen Thread zu starten und in dem den Klang abzuspielen. Dann laufen die unabhängigi voneiandner ab... jedenfalls wäre das meine erste Idee
das mit den threads bringt glaube ich nichts, da ich sogar wenn ich bei dem buttonklick nichts ausführe nach oftmaligem klicken das gesamte programm verlangsame..
hab nur son mouseclick code:
Java:
public void mousePressed(MouseEvent arg0) {
i = 0;
try
{
if (SwingUtilities.isLeftMouseButton (arg0))
{
}
oder lieg ich da falsch??
dass das programm langsamer wird sehe ich daran, dass das laden des bildes vom button wenn der mauszeiger über diesem ist verzögert nur noch kommt
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
public class Main
{
private PadView padView;
private PadModel padModel;
public static void main(String[] args)
{
Main main = new Main();
main.build();
}
public void build()
{
final Dimension screenSize = Toolkit.getDefaultToolkit ().getScreenSize ();
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
padModel = new PadModel();
IModelAccessor modelacc = padModel;
padView = new PadView(modelacc);
new PadController(padView, padModel);
frame.getContentPane().add(padView);
frame.pack();
frame.setLocation (((int)screenSize.getWidth () / 2 - frame.getWidth () / 2), ((int) screenSize.getHeight () / 2) - frame.getHeight () / 2);
frame.setVisible(true);
}
}
import java.awt.Color;
import java.awt.event.MouseListener;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.SwingConstants;
public class PadView extends JPanel
{
private static final long serialVersionUID = 1L;
private JButton button;
IModelAccessor modelacc;
enum ButtonStyle {NORMAL, OVERLAY, CLICKED};
public PadView (IModelAccessor modelacc)
{
super();
this.modelacc = modelacc;
buildView();
}
public void buildView ()
{
button = new JButton();
button.setBorder(BorderFactory.createEmptyBorder());
button.setIcon(modelacc.getImage());
button.setBorderPainted (false);
button.setBackground(Color.WHITE);
button.setContentAreaFilled (false);
button.setToolTipText("Add Sample");
button.setHorizontalTextPosition(SwingConstants.CENTER);
this.add(button);
}
public void addMouseListener (MouseListener mouseListener)
{
button.addMouseListener(mouseListener);
}
public void changeButtonImage (ButtonStyle buttonStyle)
{
switch (buttonStyle)
{
case NORMAL:
button.setIcon(modelacc.getImage());
break;
case OVERLAY:
button.setIcon(modelacc.getImageOver());
break;
case CLICKED:
button.setIcon(modelacc.getImageClicked());
break;
}
}
public void updateButtonText()
{
button.setText(modelacc.getName());
}
}
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import javax.swing.SwingUtilities;
public class PadController
{
PadView padView;
PadModel padModel;
File datei;
SampleChooser chooser;
int i = 0; // Wird gebraucht um zu gucken wo sich der Mauszeiger nach dem Loslassen des Buttons befindet, um das richtige Bild zu laden.
public PadController(PadView padView, PadModel padModel)
{
this.padView = padView;
this.padModel = padModel;
buildActionListener();
}
public void buildActionListener()
{
padView.addMouseListener(new MouseListener()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
}
@Override
public void mouseEntered(MouseEvent arg0)
{
padView.changeButtonImage(PadView.ButtonStyle.OVERLAY);
}
@Override
public void mouseExited(MouseEvent arg0)
{
padView.changeButtonImage(PadView.ButtonStyle.NORMAL);
i = 1;
}
@Override
public void mousePressed(MouseEvent arg0) {
i = 0;
try
{
if (SwingUtilities.isLeftMouseButton (arg0))
{
padView.changeButtonImage(PadView.ButtonStyle.CLICKED);
SoundPlayer tmpplayer = new SoundPlayer();
tmpplayer.play(datei);
tmpplayer = null;
}
else if (SwingUtilities.isRightMouseButton (arg0) && arg0.getClickCount () == 1)
{
chooser = new SampleChooser(new ActionListener ()
{
public void actionPerformed (ActionEvent e)
{
datei = chooser.getSelectedFile ();
padModel.setDateiName(datei.getName());
padView.updateButtonText();
chooser.dispose();
}
});
}
}
catch (Exception e)
{
}
}
@Override
public void mouseReleased(MouseEvent arg0)
{
if (i == 1)
{
padView.changeButtonImage(PadView.ButtonStyle.NORMAL);
}
else
{
padView.changeButtonImage(PadView.ButtonStyle.OVERLAY);
}
}
});
}
}
import java.awt.Image;
import javax.swing.ImageIcon;
public class PadModel implements IModelAccessor
{
int buttonGröße = 80;
private ImageIcon drumPad = new ImageIcon(this.getClass ().getResource ("Pics/DrumPad.png"));
private ImageIcon drumPadPressed = new ImageIcon(this.getClass ().getResource ("Pics/DrumPadOverlay.png"));
private ImageIcon drumPadClicked = new ImageIcon(this.getClass ().getResource ("Pics/DrumPadKlicked.png"));
String dateiName;
public void setDateiName(String dateiName)
{
this.dateiName = dateiName;
}
@Override
public ImageIcon getImage()
{
drumPad.setImage (drumPad.getImage ().getScaledInstance(buttonGröße, buttonGröße, Image.SCALE_SMOOTH));
return drumPad;
}
@Override
public ImageIcon getImageOver()
{
drumPadPressed.setImage (drumPadPressed.getImage ().getScaledInstance(buttonGröße, buttonGröße, Image.SCALE_SMOOTH));
return drumPadPressed;
}
@Override
public ImageIcon getImageClicked()
{
drumPadClicked.setImage (drumPadClicked.getImage ().getScaledInstance(buttonGröße, buttonGröße, Image.SCALE_SMOOTH));
return drumPadClicked;
}
@Override
public String getName()
{
return dateiName;
}
}
import java.applet.Applet;
import java.applet.AudioClip;
import java.io.File;
import java.net.MalformedURLException;
public class SoundPlayer
{
public void play (File file)
{
AudioClip sound = null;
try
{
java.net.URL filePath = file.toURI().toURL();
sound = Applet.newAudioClip(filePath);
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
sound.play();
sound = null;
}
}
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.filechooser.FileFilter;
public class SampleChooser extends JFileChooser
{
private static final long serialVersionUID = 1L;
final Dimension screenSize = Toolkit.getDefaultToolkit ().getScreenSize ();
JFrame frame;
public SampleChooser(ActionListener listener)
{
frame = new JFrame ();
frame.add (this);
buildFilter();
frame.pack ();
frame.setResizable (false);
frame.setVisible (true);
frame.setLocation ( ((int)screenSize.getWidth () / 2 - (frame.getWidth () / 2)), ((int) screenSize.getHeight () / 5*2) - (frame.getHeight () / 2));
this.addActionListener(listener);
}
public void buildFilter()
{
this.setFileFilter(new FileFilter()
{
@Override
public boolean accept(File file)
{
boolean endungRichtig = false;
String filename = file.getName();
if (filename.endsWith(".au"))
endungRichtig = true;
return endungRichtig;
}
@Override
public String getDescription()
{
return ".au";
}
});
}
public void dispose ()
{
frame.dispose ();
}
}
import javax.swing.ImageIcon;
public interface IModelAccessor
{
public ImageIcon getImage ();
public ImageIcon getImageOver ();
public ImageIcon getImageClicked ();
public String getName();
}
habe jetzt die mousepressed schon so gefüllt wie es später sein soll, nur leider fängt das ding nach dem 7-8 click an zu hacken, hackt 1-2 sek, haut mehrere sound über ein ander raus, und funktioniert wieder 7-8 sekunden gut.
wäre über hilfe sehr dankebar
Das liegt wohl daran, dass du jedes Mal die Sounddatei neu lädst (und das auch noch im EDT). Probier es mal mit einem einzigen AudioClip pro Datei, den du dann wiederverwendest.
Das liegt wohl daran, dass du jedes Mal die Sounddatei neu lädst (und das auch noch im EDT). Probier es mal mit einem einzigen AudioClip pro Datei, den du dann wiederverwendest.
jo danke für dein bemühen, aber leider taucht das gleiche problem auf..
ich hatte vor ein paar tagen mal eine andere lösung, die hatte jedoch eine höhere latenz, dafür aber nicht dieses "hack-problem":
ich poste mal den code vllt kannst du oder jemand anderes damit etwas anfangen und vllt das problem sehen:
Java:
import java.io.File;
import java.io.IOException;
import javax.sound.sampled.AudioFormat;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import javax.sound.sampled.DataLine;
import javax.sound.sampled.FloatControl;
import javax.sound.sampled.LineUnavailableException;
import javax.sound.sampled.SourceDataLine;
import javax.sound.sampled.UnsupportedAudioFileException;
public class PlayWaveSound extends Thread {
private String filename;
private Position curPosition;
private final int EXTERNAL_BUFFER_SIZE = 524288; // 128Kb
enum Position {
LEFT, RIGHT, NORMAL
};
public PlayWaveSound(String wavfile) {
filename = wavfile;
curPosition = Position.NORMAL;
}
public PlayWaveSound(String wavfile, Position p) {
filename = wavfile;
curPosition = p;
}
public void run() {
File soundFile = new File(filename);
if (!soundFile.exists()) {
System.err.println("Wave file not found: " + filename);
return;
}
AudioInputStream audioInputStream = null;
try {
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
} catch (UnsupportedAudioFileException e1) {
e1.printStackTrace();
return;
} catch (IOException e1) {
e1.printStackTrace();
return;
}
AudioFormat format = audioInputStream.getFormat();
SourceDataLine auline = null;
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
try {
auline = (SourceDataLine) AudioSystem.getLine(info);
auline.open(format);
} catch (LineUnavailableException e) {
e.printStackTrace();
return;
} catch (Exception e) {
e.printStackTrace();
return;
}
if (auline.isControlSupported(FloatControl.Type.PAN)) {
FloatControl pan = (FloatControl) auline
.getControl(FloatControl.Type.PAN);
if (curPosition == Position.RIGHT)
pan.setValue(1.0f);
else if (curPosition == Position.LEFT)
pan.setValue(-1.0f);
}
auline.start();
int nBytesRead = 0;
byte[] abData = new byte[EXTERNAL_BUFFER_SIZE];
try {
while (nBytesRead != -1) {
nBytesRead = audioInputStream.read(abData, 0, abData.length);
if (nBytesRead >= 0)
auline.write(abData, 0, nBytesRead);
}
} catch (IOException e) {
e.printStackTrace();
return;
} finally {
auline.drain();
auline.close();
}
}
}
Das war aber ein anderes programm aber vom nutzen her das selbe. hatte da auch beide methoden ausprobiert
Dass sich nichts verändert hat, ist auf diesen Code im
Code:
PadController
zurückzuführen:
[JAVA=158]if (SwingUtilities.isLeftMouseButton (arg0))
{
padView.changeButtonImage(PadView.ButtonStyle.CLICKED);
SoundPlayer tmpplayer = new SoundPlayer();
tmpplayer.play(datei);
tmpplayer = null;
}[/code]
Du erstellst dir immer lokal einen neuen
Code:
SoundPlayer
. Mach den mal lieber zum Member der Instanz und benutz nur ihn.
Dass sich nichts verändert hat, ist auf diesen Code im
Code:
PadController
zurückzuführen:
[JAVA=158]if (SwingUtilities.isLeftMouseButton (arg0))
{
padView.changeButtonImage(PadView.ButtonStyle.CLICKED);
SoundPlayer tmpplayer = new SoundPlayer();
tmpplayer.play(datei);
tmpplayer = null;
}[/code]
Du erstellst dir immer lokal einen neuen
Code:
SoundPlayer
. Mach den mal lieber zum Member der Instanz und benutz nur ihn.
du wirst hier vermutlich jedes mal die datei neu von der Festplatte laden.
Das Ziel hier soll sein, dass du die Datei EINMAL am Anfang lädst, oder den player damit initialisierst oder was auch immer, so dass du nur noch play() oder eine ähnliche Methode aufrufen musst, ohne jedes mal auf dein Dateisystem zurückgreifen zu müssen.
Das hängt aber auch davon ab wie diese Player-Klasse funktioniert.
Hast du eine Dokumentation/Api zu der Klasse?
Gruß
du wirst hier vermutlich jedes mal die datei neu von der Festplatte laden.
Das Ziel hier soll sein, dass du die Datei EINMAL am Anfang lädst, oder den player damit initialisierst oder was auch immer, so dass du nur noch play() oder eine ähnliche Methode aufrufen musst, ohne jedes mal auf dein Dateisystem zurückgreifen zu müssen.
Das hängt aber auch davon ab wie diese Player-Klasse funktioniert.
Hast du eine Dokumentation/Api zu der Klasse?
Gruß
das vermute ich auch ich denke mal du meinst jetzt die lange klasse die ich eben nachträglich gepostet habe??
die hab ich tatsächlich nicht selber geschrieben sondern im internet geschaut als ich noch vorhatte wav files abzuspielen. mittlerweile würde ich mich ja erstmal mit au files begnügen auch wenn das format weniger als selten vorkommt.
ich guck grad mal ob ich denk link wiederfinde..
hast du vllt einen forschlag wie man das mit diesem immer neu laden lösen könnte??
bau dir die Klasse so um, dass das setzen von dem Audioclip nur einmal gemacht werden muss und du dann einfach in deiner Play-Methode du nur noch sound.play() aufrufst.
Das wurde doch schon geklärt, oder überseh' ich da jetzt was.
Mal was ganz anderes: Wie lang/groß ist denn der Clip? Wenn du 20 mal klickst, ist es dann so (oder soll es so sein) dass der Clip 20mal "parallel" abläuft?
wurde zwar geklärt, aber er hatte nur den player lokal ausgelagert, was nichts bringt, da der player nur das laden und abspielen von dem audioclip über eine datei kapselt 🙂
- zumindest in dem letztem beispiel das er gepostet hat.
bau dir die Klasse so um, dass das setzen von dem Audioclip nur einmal gemacht werden muss und du dann einfach in deiner Play-Methode du nur noch sound.play() aufrufst.
moin vielen dank.
habe das jetzt mal gemacht sieht jetzt folgendermaßen aus:
Java:
import java.applet.Applet;
import java.applet.AudioClip;
import java.io.File;
import java.net.MalformedURLException;
public class SoundPlayer
{
AudioClip sound;
File File;
public void initialisieren(File file)
{
sound = null;
try
{
java.net.URL filePath = file.toURI().toURL();
sound = Applet.newAudioClip(filePath);
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
}
public void play ()
{
sound.play();
}
}
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import javax.swing.SwingUtilities;
public class PadController
{
PadView padView;
PadModel padModel;
File datei;
SampleChooser chooser;
SoundPlayer tmpplayer;
int i = 0; // Wird gebraucht um zu gucken wo sich der Mauszeiger nach dem Loslassen des Buttons befindet, um das richtige Bild zu laden.
public PadController(PadView padView, PadModel padModel)
{
this.padView = padView;
this.padModel = padModel;
buildActionListener();
tmpplayer = new SoundPlayer();
}
public void buildActionListener()
{
padView.addMouseListener(new MouseListener()
{
@Override
public void mouseClicked(MouseEvent arg0)
{
}
@Override
public void mouseEntered(MouseEvent arg0)
{
padView.changeButtonImage(PadView.ButtonStyle.OVERLAY);
}
@Override
public void mouseExited(MouseEvent arg0)
{
padView.changeButtonImage(PadView.ButtonStyle.NORMAL);
i = 1;
}
@Override
public void mousePressed(MouseEvent arg0) {
// i = 0;
try
{
if (SwingUtilities.isLeftMouseButton (arg0))
{
padView.changeButtonImage(PadView.ButtonStyle.CLICKED);
tmpplayer.play();
}
else if (SwingUtilities.isRightMouseButton (arg0) && arg0.getClickCount () == 1)
{
chooser = new SampleChooser(new ActionListener ()
{
public void actionPerformed (ActionEvent e)
{
datei = chooser.getSelectedFile ();
padModel.setDateiName(datei.getName());
padView.updateButtonText();
tmpplayer.initialisieren(datei);
chooser.dispose();
}
});
}
}
catch (Exception e)
{
}
}
@Override
public void mouseReleased(MouseEvent arg0)
{
if (i == 1)
{
padView.changeButtonImage(PadView.ButtonStyle.NORMAL);
}
else
{
padView.changeButtonImage(PadView.ButtonStyle.OVERLAY);
}
}
});
}
}
es ist definitiv besser geworden, ich würde sogar sagen, das problem mit dem haken ist weg.
aber leider, wenn der button oft gedrückt wurde (da ist jetzt die schnelligkeit egal) kommt es nach dem 15-20mal vor, dass einzelne buttonklicks ignoriert werden, und einfach kein sound kommt. (hier jetzt wieder nur, wenn schnell nacheinander geklickt wird) und
je öfter der button bereits gedrückt wurde desto langsamer reagiert er. führt man dann das programm neu aus ist er wieder super und nach dem 15-20 mal wieder das selbe problem..
ich spiele keine lange datei ab, einfach nur eine snare oder ein kick. sind nicht mal eine sekunde lang. trotzdem kann es natürlich passieren, dass zeitweise zwei sounds übereinander gespielt werden. ich weiß das die aktuelle play methode den sound stoppt sobald ein neuer gespielt werden soll. das sollte natürlich später noch geändert werden, da es so natürlich vorkommen kann das der sound kurz knackt.
aber das kommt danach.
danke für eure antwortet bis hier hin schonmal
was mir grade noch auffällt.
selbst wenn ich kein sample lade und einfach nur auf den button drücke, reagiert, der button nachdem er häufig gedrückt wurde, nur noch zeitversetzt auf das ändern des bildes bzw teilweise garnicht.
ich hab natürlich für den versuch das sound play aus dem mouseclick ausgeklammert.
muss ich nicht vllt jeden play in nem eigenen thread ablaufen lassen:
Java:
import java.applet.Applet;
import java.applet.AudioClip;
import java.io.File;
import java.net.MalformedURLException;
public class SoundPlayer implements Runnable
{
AudioClip sound;
File File;
public void initialisieren(File file)
{
sound = null;
try
{
sound = Applet.newAudioClip(file.toURI().toURL());
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
}
public void play ()
{
Thread th = new Thread(this);
th.start();
// sound.play();
}
@Override
public void run() {
sound.play();
}
}
nur leider muss nach dem export in ein jar file der sound ganz ausgeklungen sein bevor er neu gespielt werden kann..
aber das versteh ich nicht es wird doch dann wieder ein neuer thread erzeugt, der davon unabhängig ist.. oder?
Hat noch garkeiner hier im forum jemals ein audioprogramm mit java geschrieben? die latenz ist übrigens auch grauenhaft wenn ich das jar file auf nem anderen rechner ausführe..
Ohne was versprechen zu wollen: Bei einem KSKB (ggf. sogar mit der original-Sounddatei, sofern es keine Standard-Windows-Datei ist) würden vielleicht mehr Leute sich das mal ansehen...
Ohne was versprechen zu wollen: Bei einem KSKB (ggf. sogar mit der original-Sounddatei, sofern es keine Standard-Windows-Datei ist) würden vielleicht mehr Leute sich das mal ansehen...
hätte kein problem mit zb ner wave datei. das wäre sowieso am besten. aber java kann das doch nicht oder? deshalb hab ich ja diese völlig komischen au dateien. ich krieg aus ner wave zumindest in java kein ton raus..
naja was meinst mit kskb ich meine die soundabspiel klasse müsste ja vermutlich komplett neu geschrieben werden. und das soll halt einfach nur passieren wenn man auf einen button klickt.
Java kann eigentlich .wav Dateien abspielen, aber das sollte doch erstmal für ein KSKB keine Rolle spielen. Muss zugeben, ohne ein KSKB hätte ich jetzt keine Lust mich mit diesem Thema zu befassen 🙂
Was ist KSKB? Antwort: Geh mit der Maus drüber!
Mfg
Java kann eigentlich .wav Dateien abspielen, aber das sollte doch erstmal für ein KSKB keine Rolle spielen. Muss zugeben, ohne ein KSKB hätte ich jetzt keine Lust mich mit diesem Thema zu befassen 🙂
Was ist KSKB? Antwort: Geh mit der Maus drüber!
Mfg
danke das weiß ich habe aber keine ahnung wie das aussehen soll, weil mir ja die methode fehlt um den sound abzuspielen. das andere ist halt einfach nur ein button auf einem panel.
soll ich jetzt die gui aufschreiben wie man das baut?? das würde doch nicht weiterhelfen.
oder kann es sein das java einfach zu lahm für nen drumcomputer ist?
Naja, du stellst uns Code zur Verfügung, wo genau dort der Fehler auftritt.
Also wo wir nur Copy&Paste machen müssen und dann ausführen.
Bei den Code handelt es sich um eine verkürzte Version deiner Anwendung (empfohlen) oder einfach nur ein Beispiel wo genau der gleiche Fehler auftritt.
Zur GUI, es reicht schon ein fenster mit einem Button, vorrausgesetzt dort tritt der Fehler auf 🙂
weil mir ja die methode fehlt um den sound abzuspielen.
??
Dein fehler ist es doch, das er den Ton nach mehrmaligen betätigen das Buttons nicht mehr abspielt?
Also hast du doch eine Methode um Sound abzuspielen?
Hast du eigentlich schon mal mit dem Taskmanager z.B überprüft, wie dein Speicherverbrauch ist, nach mehrmaligen drücken des Buttons?
Naja, du stellst uns Code zur Verfügung, wo genau dort der Fehler auftritt.
Also wo wir nur Copy&Paste machen müssen und dann ausführen.
Bei den Code handelt es sich um eine verkürzte Version deiner Anwendung (empfohlen) oder einfach nur ein Beispiel wo genau der gleiche Fehler auftritt.
Zur GUI, es reicht schon ein fenster mit einem Button, vorrausgesetzt dort tritt der Fehler auf 🙂
??
Dein fehler ist es doch, das er den Ton nach mehrmaligen betätigen das Buttons nicht mehr abspielt?
Also hast du doch eine Methode um Sound abzuspielen?
Hast du eigentlich schon mal mit dem Taskmanager z.B überprüft, wie dein Speicherverbrauch ist, nach mehrmaligen drücken des Buttons?
jop habe ich schon geprüft. der speicher bleibt konstant.
gut dann hier nochmal meine soundabspielmethode:
Java:
import java.applet.Applet;
import java.applet.AudioClip;
import java.io.File;
import java.net.MalformedURLException;
public class SoundPlayer
{
AudioClip sound;
File File;
Thread th;
public void initialisieren(File file)
{
sound = null;
try
{
sound = Applet.newAudioClip(file.toURI().toURL());
}
catch (MalformedURLException e)
{
e.printStackTrace();
}
}
public void play ()
{
sound.play();
}
}
Die Methode wird abgespielt wenn auf einen Button geklickt wurde.
also irgendwie sowas in der art:
Java:
JButton button = new JButton;
panel.add(button);
button.addActionListener(new ActionListener()
{
public void mousePressed(MouseEvent arg0)
{
if (SwingUtilities.isLeftMouseButton (arg0))
{
tmpplayer.play();
}
}
} // stark vereinfach und wie ihr es nennt pseudocode, damit ihr nochmal seht wie ich es meine. es fehlen die anderen mouselistener methoden die implementiert werden müssen da sie es nur unübersichtlich machen würden.
Natürlich muss vorher noch tmplayer.initialisieren aufgerufen werden, das ist mir klar.
was mich jetzt interessieren würde ist, was macht dieses play in der soundklasse?
ich vermute das man dort etwas neu schreiben muss, da ich nur die eine zeile habe wenn auf den button gedrückt wurde die ausgeführt wird. aber ich weiß ja nicht was in diesem "play" alles passiert. vielleicht liegt da der grund dafür?
Mit dem gezeigten Code kann ich im Prinzip nichts Anfangen weil es nicht dein Problem zeigt.
Ich kann es nicht ausführen und somit dein Fehler nicht nachvollziehen. Wir brauchen ein ausführbaren Code, mit der main Methode und Co.
Ansonsten, würde ich bei jedem Buttonclick prüfen ob sound != null und wenn true dann sound.stop() und dann neu initialisieren und dann play. Oder sollen die Sound parallel abgespielt werden?
Ansonsten schau dir mal z.B hier deren Beispiele an:
Der Sinn eines KSKBs ist, Leuten, die in der Mittagspause (wie ich gerade) mal kurz schauen wollen, die Möglichkeit zu geben, innerhalb von 1 Minute den Fehler nachzuvollziehen... Wenn ich für jedes mal, wo ich
public static void main(String args[])
oder auch
public class ClassWithTestForThisForumPostWithoutKSKB
geschrieben habe, einen Euro bekommen hätte... :reflect: