» »

[Java] KeyListener težava

[Java] KeyListener težava

javaMaster ::

Živjo,
Žeim naredit neke vrste virtual piano :D.

Imam sledeč problem:

    Želim, da ob pritisku točno določene tipke na tipkovnici program predvaja točno določeno mp3 datoteko. Ko pritisnem tipko mi ne predvaja ničesar. Izpiše pa mi tole napako:
     java.net.MalformedURLException: no protocol: 


    Ker to naj bi bil klavir si belim glavo kako naredit, da lahko pritisnem več tipk hkrati (dovolj 4; baje so omejitve)in poslednično se predvaja več datotek istočasno. Jaz sem imel v mislih threading. A ima kod kakšno idejo oz. nasvet




tukaj imam še kodo:


        theHandler action = new theHandler();
        Cton.addKeyListener(action);
        Dton.addKeyListener(action);
        Eton.addKeyListener(action);
    }
    private class theHandler extends KeyAdapter {

        public void keyPressed (KeyEvent event){

        try {
               if (event.getKeyChar()== 'a')
                    Datoteka = "../Cton.mp3";
                else if (event.getKeyChar()== 's')
                    Datoteka = "../Dton.mp3";
                else if (event.getKeyChar()== 'd')
                    Datoteka = "../Eton.mp3";

                AudioClip clip = Applet.newAudioClip(new URL(Datoteka));
                clip.play();

}
catch (Exception e) {
System.out.println(e.toString());
}

        }
    }
}



Bi bil vesel in hvaležen, če bi mi kdo pomagal pri prvem problemu. Hvala

vorantz ::

Glede na "no protocol" ti mogoče manjka "file://" v Datoteka

edit:
tle je en primer
http://www.java2s.com/Code/JavaAPI/java...

Zgodovina sprememb…

  • spremenil: vorantz ()

javaMaster ::

Sem dopisal tisto in zdaj ne pride do napake. Za preverjanje sem izpisal v konzolo, tisto kar pritisnem na tipkovnico, nad ukazom za predvajanje (clip.play();) in izpiše šele ko zaprem aplikacijo. Potem sem izpisal takoj za if stavki in izpiše takoj. Hmm...mogoče je ka na tem

javaMaster ::

Ne vem zakaj noče predvajat. Sem poskušal z mp3 in wav datotekami... Mogoče ve kdo kaj je narobe?

javaMaster ::

Sm že rešu problem z drugo kodo. Hvala za pomoč. Admin lahko zapre temo.

javaMaster ::

Sem rešu prvi problem z drugo kodo in zdaj lepo dela. Me pa še zanima če bi kdo vedel kako naredit, da lahko pritisnem več tipk istočasno in ob tem bi se predvajalo več wav datotek istočasno. Ideje, nasveti...?

Zgodovina sprememb…

vorantz ::

Ko zazna novo tipko, naredi novo nit
Ta nit potem odšpila zadevo in se konča
Vsaj jaz bi se tako lotil, mogoče ma kdo kako pametnejšo idejo

javaMaster ::

Ja tudi jaz sem imel to v mislih. Hvala

Spura ::

Zakaj imas imena razreda z malo in imena spremenljivk z veliko? Zakaj si preprosto ne preloadas zvokov?

javaMaster ::

Sorry, za zamudo sem šele danes vidu post. Ja, pač tku sem jih poimenoval.
Kako misliš preloudat?? Lahko malo razložiš ?
Aja tisto je stara koda. Spremenil sem način predvajanja in tudi deluje, ampka me zanima tvoja rešitev. Hvala

Zgodovina sprememb…

win64 ::

ustvariš instančne spremelnjivke razreda:

private AudioClip clipE, clipF, clipD,...;


v konstruktor ali inicializacijo dodaš to:
public Razred(){
...
 clipE=Applet.newAudioClip(new URL("../Eton.mp3"));
 clipF=Applet.newAudioClip(new URL("../Fton.mp3"));               
 clipD=Applet.newAudioClip(new URL("../Dton.mp3")); 
...
}


pri predvajanju pa samo:
if (event.getKeyChar()== 'a')
                    clipF.play();
                else if (event.getKeyChar()== 's')
                    clipD.play();
                else if (event.getKeyChar()== 'd')
                    clipE.play();


Tako programu ni potrebno vsakič odpirati datoteke in nalagati zvoka, kar prinese pohitritev(disk je počasen!!!)

win64 ::

Edit: Malo bolj težavno je, ker imaš handler v drugem razredu. Implementiraj raje KeyListener v zgornjem razredu, potem ta težava izgine. Skupno nekako tako:
public class Razred extends... implements KeyListener{
....
private AudioClip clipE, clipF, clipD,...;

public Razred(){
...
 clipE=Applet.newAudioClip(new URL("../Eton.mp3"));
 clipF=Applet.newAudioClip(new URL("../Fton.mp3"));               
 clipD=Applet.newAudioClip(new URL("../Dton.mp3")); 
...
}

@Override
public void keyPressed(KeyEvent event) {
if (event.getKeyChar()== 'a')
    clipF.play();
else if (event.getKeyChar()== 's')
    clipD.play();
else if (event.getKeyChar()== 'd')
    clipE.play();
}

	@Override
	public void keyReleased(KeyEvent e) {}

	@Override
	public void keyTyped(KeyEvent e) {}
}

Zgodovina sprememb…

  • spremenil: win64 ()

javaMaster ::

Najlepša hvala za izčrpen odgovor. Bom preizkusil.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[Java] Zasnova shoot em up igre

Oddelek: Programiranje
111173 (852) PecenkA
»

[Java] Zagon appleta v HTML

Oddelek: Programiranje
161519 (1341) Bela01
»

[JAVA] branje iz datoteke

Oddelek: Programiranje
242384 (2019) Bela01
»

[Java] Grafika

Oddelek: Programiranje
91442 (1209) SkIDiver
»

[NALOGA][Java] Težave pri pisanju slikarja

Oddelek: Programiranje
202245 (1887) l0g1t3ch

Več podobnih tem