Häufiger buttonklick

AsterixdGallier

Aktives Mitglied
hallo ich habe ein problem:

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.
 
B

Beni

Gast
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.
 
Zuletzt bearbeitet von einem Moderator:

HimBromBeere

Top Contributor
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
 

AsterixdGallier

Aktives Mitglied
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
 

AsterixdGallier

Aktives Mitglied
gut hier der ganze:

Java:
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
 
Zuletzt bearbeitet:

xehpuk

Top Contributor
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.
 

AsterixdGallier

Aktives Mitglied
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.

hmm wie genau meinst du das?

du meinst wohl es liegt an dieser klasse?

Java:
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;
	}	
}
 

xehpuk

Top Contributor
Genau. Hier mal banal mit "Caching" in einer Map:

Java:
import java.applet.Applet;
import java.applet.AudioClip;
import java.io.File;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;

public class SoundPlayer {
	private Map<File, AudioClip> clips = new HashMap<File, AudioClip>();
	
	public void play(final File file) {
		AudioClip sound = clips.get(file);
		if (sound == null) {
			try {
				final java.net.URL filePath = file.toURI().toURL();
				sound = Applet.newAudioClip(filePath);
				clips.put(file, sound);
			} catch (final MalformedURLException e) {
				e.printStackTrace();
			}
		}
		sound.play();
	}
}
 

AsterixdGallier

Aktives Mitglied
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
 

xehpuk

Top Contributor
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.
 

AsterixdGallier

Aktives Mitglied
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.

ich denke du meinst so?

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;
	int i = 0;					// Wird gebraucht um zu gucken wo sich der Mauszeiger nach dem Loslassen des Buttons befindet, um das richtige Bild zu laden.
	SoundPlayer tmpplayer;
	
	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);
//						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);
				}
			}
		});		
	}	
}

hat sich leider nichts geändert.. :(
ich dachte es wäre hier: http://www.anyexample.com/programming/java/java_play_wav_sound_file.xml
gewesen aber da ist irgendwie error angesagt.. vllt hat ja trotzdem jemand nen anhaltspunkt..
 
Zuletzt bearbeitet:
F

Firephoenix

Gast
Java:
tmpplayer.play(datei);

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ß
 

AsterixdGallier

Aktives Mitglied
Java:
tmpplayer.play(datei);

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??

kann den link grade leider nicht finden..
 
Zuletzt bearbeitet:
F

Firephoenix

Gast
Java:
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;
    }

jedesmal lädst du den AudioClip neu aus dem Path.

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.
 

Marco13

Top Contributor
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?
 
F

Firephoenix

Gast
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.
 

AsterixdGallier

Aktives Mitglied
Java:
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;
    }

jedesmal lädst du den AudioClip neu aus dem Path.

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.
 
Zuletzt bearbeitet:

AsterixdGallier

Aktives Mitglied
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..
 
Zuletzt bearbeitet:

Marco13

Top Contributor
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...
 

AsterixdGallier

Aktives Mitglied
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.
 
Zuletzt bearbeitet:

truesoul

Top Contributor
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
 

AsterixdGallier

Aktives Mitglied
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?
 

truesoul

Top Contributor
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?
 

AsterixdGallier

Aktives Mitglied
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?
 
Zuletzt bearbeitet:

truesoul

Top Contributor
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:

Sound Application : SoundDevelopment ClassJava

Mfg
 

Marco13

Top Contributor
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:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T Schauen ob eine Ziffer in einem String-Array häufiger vorkommt Java Basics - Anfänger-Themen 8
J Einen Buttonklick in Label anzeigen Java Basics - Anfänger-Themen 6
D Mit Buttonklick Farbe der anderen Buttons verändern? Java Basics - Anfänger-Themen 2
B Methoden Per Buttonklick eine Zufallszahl in ein Numberfield geben Java Basics - Anfänger-Themen 2
U Java Swing Timer mit ButtonKlick starten u. nach 12 Sekunden Befehl ausführen Java Basics - Anfänger-Themen 7
T Bei Buttonklick Aktion starten, nach erneutem Klick beenden Java Basics - Anfänger-Themen 4
B Variable erhöhen per Buttonklick? Java Basics - Anfänger-Themen 7
S ButtonKlick mit JFrame (Netbeans) fragen.. Java Basics - Anfänger-Themen 8
A nur bei gedrücktem buttonklick aus gui wert einlesen Java Basics - Anfänger-Themen 4
SheldoN Sound abspielen nach Buttonklick in Applets Java Basics - Anfänger-Themen 17
J neuen jFrame öffnen per buttonklick Java Basics - Anfänger-Themen 3
B Buttonklick zuordnen Java Basics - Anfänger-Themen 2
Z Array Componenten auf Buttonklick nacheinander ausgeben. Java Basics - Anfänger-Themen 10
M Text per Buttonklick in eine Textbox schreiben Java Basics - Anfänger-Themen 9
Q Classe durch Buttonklick im Layout öffnen Java Basics - Anfänger-Themen 4
L Batik (Zoomen auf einen Buttonklick) Java Basics - Anfänger-Themen 3
G Buttonklick -> Aufruf einer Webseite Java Basics - Anfänger-Themen 16
M Exception nach Buttonklick Java Basics - Anfänger-Themen 4
G Sound bei buttonklick abspielen Java Basics - Anfänger-Themen 7
K Neues Fenster per Buttonklick, Texteingabe speichern Java Basics - Anfänger-Themen 9
P Fenstergröße per Buttonklick erweitern? Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben