Aloitin itse java opiskelun kesäopintona ja kaikki muut tehtävät on mennyt hyvin ja tässä tehtävässä mulla meni ihan aivot solmuun. Pitäisi tehdä tälläinen tehtävä;
Tehtävä 1: Kuvat ja animaatio
Tee Java-ukosta animaatio käyttäen säiettä sekä MediaTracker-luokkaa. Aseta kuvat MediaTracker-olion seurantaan addImage-metodilla. Määrittele animaation nopeus säikeen keskeytysajalla.
Lataa kuvatiedosto zip -pakettina (10 gif-kuvaa).
Kuvat sijaitsevat tässä kansiossa eli samassa missä projektikin sijaitsee...C:\Users\Krista\Desktop\Java-programming\Jakso 7\JavaApplication55\build\classes\javaapplication55
En tiedä mikä mättää koodissani, yiritin tehdä sen oppimani mukaan ja ei ole ketään, joka auttaisi (opekaan ei vastaa kysymyksiin, koska heinäkuu on lomakuukausi). Luulen ehkä että getCodeBase kohdassa on joku vika tai kuvat sijaitsevat väärässä paikassa? Jos joku voisi auttaa niin olen todella kiitollinen 😁.
import java.applet.Applet; import java.awt.*; public class Animaatio extends Applet implements Runnable { Image[] imgArray = null; MediaTracker tracker = null; int current = 0; Thread animThread=null; // Check for a mouse click, to start the images downloading @Override public void init() { if (tracker == null) { // Creating a new media tracker, to track loading images tracker = new MediaTracker(this); // Creating an array of ten images imgArray = new Image[10]; // Downloading the images for (int i=0; i < 10; i++) { // Loading the images imgArray[0] = getImage( getCodeBase(), (i+1) + "T1.gif"); tracker.addImage(imgArray[0], 0); imgArray[1] = getImage( getCodeBase(), (i+1) + "T2.gif"); tracker.addImage(imgArray[1], 0); imgArray[2] = getImage( getCodeBase(), (i+1) + "T3.gif"); tracker.addImage(imgArray[2], 0); imgArray[3] = getImage( getCodeBase(), (i+1) + "T4.gif"); tracker.addImage(imgArray[3], 0); imgArray[4] = getImage( getCodeBase(), (i+1) + "T5.gif"); tracker.addImage(imgArray[4], 0); imgArray[5] = getImage( getCodeBase(), (i+1) + "T6.gif"); tracker.addImage(imgArray[5], 0); imgArray[6] = getImage( getCodeBase(), (i+1) + "T7.gif"); tracker.addImage(imgArray[6], 0); imgArray[7] = getImage( getCodeBase(), (i+1) + "T8.gif"); tracker.addImage(imgArray[7], 0); imgArray[8] = getImage( getCodeBase(), (i+1) + "T9.gif"); tracker.addImage(imgArray[8], 0); imgArray[9] = getImage( getCodeBase(), (i+1) + "T10.gif"); tracker.addImage(imgArray[9], 0); } // Start animation thread animThread = new Thread(this); animThread.start(); } try{ animThread.join(); }catch (InterruptedException e){} } @Override public void update(Graphics g) { paint(g); } @Override public void paint (Graphics g) { g.setColor(Color.white); g.fillRect(0,0, 200, 200); g.setColor(Color.black); // Check to see if images have started loading if (tracker == null) { g.drawString ("Click to start loading",20,20); } else // Check to see if images have loaded if (tracker.checkAll()) { g.drawImage(imgArray[current++], 0, 0, this); if (current >= imgArray.length) current=0; } else // Still loading { g.drawString ("Images are loading...", 20,20); } } @Override public void run() { try { tracker.waitForAll(); for (;;) { // Repainting the images repaint(); Thread.sleep(2000); } } catch (InterruptedException e) {} } }
Ensimmäinen asia mikä ihmetytti on, että lataat kaikki kuvat 10 kertaan (yhteensä 100 latausta) ja koitat ladata kuvatiedostot 1T1.gif, 1T2.gif, 2T1.gif, 2T2.gif jne.
Aijaa...okey, en oo tainnut sitten ihan ymmärtää miten tuo kohta sitten oikeasti tehdään:s. Viittitkö näyttää ihan korjaamalla tuota kohtaa...Olen nimittäin sellainen joka oppii esimerkin avulla ja sen jälkeen pystyn soveltamaan.=)
Onko mitään muuta vikaa siinä...
No minkä nimiset niitten tiedostojen pitäisi olla? Toisaalta jos olet tuon osannut itse kirjoittaa, niin luulisi että osaisit korjauksenkin tehdä itse... :o
Eli periaatteessa joko poista for-looppi latausten ympäriltä ja kultakin riviltä
(i+1) +
Tai sitten for-loopin sisälle laitat vain yhden latauksen tyyliin
imgArray[i] = getImage( getCodeBase(), "T" + (i+1) +".gif");
En sitten tiedä toimiiko tuo noinkaan, kun en jaksa alkaa javaympäristöä asentaa testatakseni, mutta ainakin yksi selkeä vika poistuisi.
Tein tämän mukaan
imgArray[i] = getImage( getCodeBase(), "T" + (i+1) +".gif");
ja saan edelleen vastauksen "BUILD SUCCESSFUL (total time: 0 seconds)"? Eikä mitään ikkunaakaan avaud...?
Tiedostot ovat nimeltään T1,T2...T10 eli 10 gif kuvaa yhteensä ja latasin kuvat samaan kansioon kuin kyseisen projektinkin.
Mod. lisäsi kooditagit!
BUILD SUCCESSFUL on mielestäni ihan toivottava tulos: koodi on käännetty.
Ikkunan avautuminen ei selvästikään ole tuosta koodista kiinni. Mistä päättelit, että käännöksen jälkeen pitäisi avautua ikkuna? Oletko saanut mitään applettia (vaikka ihan tyhjää applettia) näkyville?
En ole saanut...
Käytän myös Netbeans ohjelmaa.
Kannattanee lukea siinä tapauksessa NetBeansin ohje appletin tekemisestä ja testata ensin ohjeessa olevalla koodilla, että kaikki toimii.
Tein ohjeiden mukaisesti ja se toimi, tein saman omalleni sain tyhjän applet viewer:in, joka jatkoi vain suorittamista...?En oikee ymmärrä onko kuvat jossain väärässä kansiossa vai....?
Senhän saat selville, kun tulostat absoluuttisen polun, josta yrität kuvia lukea, ja tutkit että onko se oikein.
Kääntäminen on eri asia kuin softasi käynnistäminen. oletko ajanut kääntämäsi paketin?
En ole tainnut kääntää...(täytyy kattoo miten se tehdään sitten).Olin laittanut saman koodin yhteen toiseen paikkaan ja ne sano et mun run () metodi oli täysin hyödytön sekä join-metodi?
Build tarkoittaa kääntämistä. lyhyesti, javan tapauksessa käännät koodeistasi jar paketin, joka käynnistetään kuin mikä tahansa sovellus koneellasi. Jotkut IDE:t (kuten NetBeans) sisältää myös ominaisuuden, jossa saman toiminnallisuuden takaa sekä käännetään että käynnistetään (Monessa on tätä varten erillinen play tai run painike)
Jos tulee esiin applet viewer, ilmeisesti koodi on käännetty ja ajettu. Suosittelen toimivan esimerkin muokkaamista pala kerrallaan, siis ensin vain tekstin näyttö, sitten vaikka yhden kuvan lataus ja piirto ja lopuksi vasta animaation yritys.
Okei yritän tehdä uudelleen tuon, pieni kysymys vielä mikä on oikea paikka niille kuville, yritin kattoo netistä mikä kansio mut puhuttiin bin kansiosta ja sitä ei kyl löydy multa!onkoo tehny vahongos jotain et se on häippässyt vai se kyseinen kansio on eri nimellä?
Kuvien pitäisi olla luultavasti samassa paikassa kuin käännetyn koodin (eli tiedoston Animaatio.class). Asiahan selviää helpoiten, kun tulostat käyttämäsi polun (eli käytännössä getCodeBase()), kuten The Alchemist jo ehdotti.
Kiitos neuvoista,yritän uudelleen ja katsotaan mitä tapahtuu
Okey, kokeilin luoda yhden kuvan appletviewer:iin ja se toimi.
Ongelma kuitenkin syntyy animaatiossa. Appletviewer antaa lauseen applet started mutta mitään ei näy???Tartten apuu..nyyh...
import java.applet.Applet; import java.awt.*; public class Animaatio extends Applet implements Runnable { Image images[] = null; MediaTracker tracker = null; Thread animaatio; Graphics g; @Override public void init() { tracker = new MediaTracker(this); images = new Image[10]; for (int i=0; i < 10; i++) { images[i] = getImage( getCodeBase(),"T" + (i+1) + ".gif"); tracker.addImage(images[i],0); } try{ tracker.waitForAll(); }catch (InterruptedException e){} } @Override public void start() { if (animaatio == null) { animaatio = new Thread(this); animaatio.start(); } } public void paintComponent (Graphics g) { super.paintComponents(g); g.drawImage(images[10], 0, 0, this); } @Override public void run(){ while(true){ repaint(); try{ Thread.sleep(1000); } catch (InterruptedException e) {} } } }
En nyt kaikkea ymmärrä tuosta koodistasi (esim. mikä tuo @override on ja mitä se tekee), mutta pääohjelmassa voisi olla for-luuppi i=0-9 ja sieltä piirto kuva kerrallaan.
ja varmaan jotenkin tällain:
public void run(){ for (int i=0; i < 10; i++){ g.drawImage(images[i], 0, 0, this); repaint(); try{ Thread.sleep(1000); } catch (InterruptedException e) {} } }
Kuvat ovat taulukon kohdissa 0–9, joten selvästikään ei ole mahdollista piirtää kuvaa kohdasta 10. Kyseinen säie siis kaatuu siihen, ja sen jälkeen ohjelmassasi ei enää tapahdu mitään. Alkuperäisessä koodissasi olit jo ratkaissut tämän laskurimuuttujalla, eli kokeilepa sitä uudestaan.
TapaniS: Javassa ei piirretä noin silmukassa, vaan kysyjän repaint-tekniikka on sinänsä toimiva. @Override ilmoittaa, että metodin on tarkoitus korvata yliluokassa olevan metodin, ja kääntäjä varoittaa, jos näin ei olekaan (eli on vaikka kirjoitusvirhe metodin nimessä).
Ongelma ratkesi, tein koodista tälläisen kiitos Metabolix:in. Nyt tuli uusi ongelma eli vanhat kuvat eivät lähde alta pois? Ne jää siihen...muistan että siihen taisi olla jonkinlainen keino millä ne sai pois mutta en nyt löydä sitä (ihakiva)...jos joku viittis neuvoo viel.
import java.applet.Applet; import java.awt.*; public class Animaatio extends Applet implements Runnable { Image images[] = null; int currentImage = 0; Image imageCurrent; MediaTracker tracker = null; Thread animaatio; Graphics g; @Override public void init() { images = new Image[10]; for (int i=0; i < images.length; i++) { images[i] = getImage( getCodeBase(),"T" + (i+1) + ".gif"); tracker = new MediaTracker(this); tracker.addImage(images[i],i); } try{ tracker.waitForAll(); }catch (InterruptedException e){} } @Override public void start() { if (animaatio == null) { animaatio = new Thread(this); animaatio.start(); } } public void start(Graphics g) { g.drawImage(images[0],0,0, this ); currentImage = 0; } @Override public void update(Graphics g) { g.drawImage( imageCurrent,0,0, this ); } @Override public void run(){ int iPictureNumber[] = {0, 1, 2, 3,4,5,6,7,8,9,10}; while( true ) { for( int i = 0; i < iPictureNumber.length; i++ ) { imageCurrent = images[iPictureNumber[i]]; repaint(); try { Thread.sleep( 400 ); } catch (InterruptedException e){} } } }}
Jälleen voit palata alkuperäiseen koodiisi, jossa aina piirtämisen aluksi piirretään pohjalle yksivärinen laatikko (fillRect).
Kannattanee myös lisätä run-metodin catch-lohkoon break-lause, jotta ohjelmasi on mahdollista keskeyttää.
NO NYT TOIMII HYVIN! KIITOKSIA OIKEIN PALJON, todella arvostavaa tälläinen neuvominen.
Aihe on jo aika vanha, joten et voi enää vastata siihen.