FerozMedlem sedan nov. 20046 inlägg Hej! Jag läser Java i skolan och är nybörjare.
Mitt problem ligger i metoden ActionPerformed, alltså den klassen som du hamnar i om du trycker på en JButton. Om jag förstått allt rätt så räknas denna metod som en egen tråd?
Jaja, det jag vill göra är att anropa en metod i samma klass när jag trycker på en knapp.
Men det fungerar inte! Jag kan anropa metoden ifrån andra klasser och ifrån andra delar av samma klass, men inte ifrån "ActionPerformed"-metoden...
Beror det på att man byter tråd?
Hur skall jag göra för att få anropet att fatta vad det är jag menar?
class Spel extends JFrame implements ActionListener
{
...en massa kod...
public void trycka(int nummer)
{
try {Thread.sleep(300);} catch (InterruptedException e) {}
knapp[nummer].setIcon(ner[nummer]);
try {Thread.sleep(500);} catch (InterruptedException e) {}
knapp[nummer].setIcon(upp[nummer]);
}
public void actionPerformed(ActionEvent e)
{
if (e.getSource() == knapp[3])
trycka(3);
}
}
spangoMedlem sedan juni 20008 205 inlägg Det där ska funka (även om det inte är någe bra att ha sleep o.dy. i metoder som anropas av event-tråden, då det fördröjer alla events som kan tänkas inträffa under tiden). Hur är det det "inte funkar"? Kompileringsfel? Exceptions? Händer inget?
FerozMedlem sedan nov. 20046 inlägg Jag har testat en hel del nu och kommit fram till att metoderna faktiskt anropas, men de gör inte som de ska!
jag tror att det är trycka() som inte fungerar. När jag först kör programet anropas visa() som anropar trycka() och då gör programet som det skall. Jag kan anropas visa() och trycka() hur många gånger jag vill ifrån både main och ifrån samma konstruktorn i klass och den fungerar alltid.
Men när jag sen försöker anropa metoden ifrån actionPerformed så fungerar den inte...
//////////////////////////////////////////////////////////////////////////////////////
public void trycka(int nummer)
{
try {Thread.sleep(300);} catch (InterruptedException e) {}
knapp[nummer].setIcon(ner[nummer]);
try {Thread.sleep(500);} catch (InterruptedException e) {}
knapp[nummer].setIcon(upp[nummer]);
}
//////////////////////////////////////////////////////////////////////////////////////////
public void visa()
{
for(int index=0; index<knappfacit.size(); index++)
trycka(((Integer) knappfacit.get(index)).intValue());
}
//////////////////////////////////////////////////////////////////////////////////////////
ViktorMedlem sedan aug. 20021 752 inlägg Åter igen, vad är det som inte fungerar? Vad får du för fel?
/Viktor
FerozMedlem sedan nov. 20046 inlägg Ursäkta, det kanske inte framgick att jag lyckas kompilera programmet utan problem.
Men när jag kör det och kommer till den punkt där trycka() anropas ifrån actionperformed så anropas den men sleep och bytabildsaken fungerar inte. Det gör dom därimot när den anropas ifrån någon annanstans i koden.
ViktorMedlem sedan aug. 20021 752 inlägg Har du provat med att slänga in en "System.out.println(nummer);" först i trycka funktionen? Då kan du se exakt vilket nummer som skickas (och om det skickas något). Prova även att slänga in "e.printStackTrace(System.err);" i din catch block så du kan se om det är något som går fel där (du bör alltid skriva ut felmedelanden i catch block).
/Viktor
FerozMedlem sedan nov. 20046 inlägg Ja, allt det stämmer. Det enda som inte fungerar är Sleep
FerozMedlem sedan nov. 20046 inlägg Jag försökte fuska och byta ut Sleep mot en While-sats som räknar ned, men den hoppade över den också...
spangoMedlem sedan juni 20008 205 inlägg Mhm, det är kompilatorn som optimerar bort busy waits. Men hur är det sleep inte "fungerar"? Får du ett InterruptedException?
FerozMedlem sedan nov. 20046 inlägg det vet jag inte... hur kollar det och hur får jag den att priritera sleep?
spangoMedlem sedan juni 20008 205 inlägg try {
Thread.sleep(300);
} catch (InterruptedException e) {
System.err.println("Någonting gick snett:");
e.printStackTrace();
}
Egentligen borde du inte få några såna här undantag, men man vet ju inte.