että en tahdo saada oikein millään näitä kuvia ikkunaan.
Käytän käyttöymräristönä netbeans IDE:ta (http://www.netbeans.org/about/index.html) ja en tiedä onko sillä vaikutusta koodin toimivuuteen. Tietääkö joku mitä kaikkea tulee huomioida kuvia ladattessa sovellukseen?
Tässä on yksi esimerkki kuva koodistani, joka ei toimi (sovelluksessa ladattava kuva testi on jpg tyyppinen nimellä testi samassa kansiossa kuin koodi):
package testeja; import java.awt.*; import javax.swing.*; import java.awt.Image.*; public class Kuva extends JFrame{ Image kuva; public Kuva(){ this.setSize(600,600); this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); kuva = Toolkit.getDefaultToolkit().getImage("testi.jpg"); System.out.println(kuva); } public void paint(Graphics g) { g.drawRect(100,100,200,200); g.drawImage(kuva, 100,100,this); } public static void main(String args[]){ Kuva kalle = new Kuva(); } }
kääntäjä sanoo:
java.lang.NullPointerException at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:50) at sun.java2d.pipe.DrawImage.copyImage(DrawImage.java:736) at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:2755) at sun.java2d.SunGraphics2D.drawImage(SunGraphics2D.java:2745) at testeja.Kuva.paint(Kuva.java:26) at sun.awt.RepaintArea.paint(RepaintArea.java:177) at sun.awt.windows.WComponentPeer.handleEvent(WComponentPeer.java:260) at java.awt.Component.dispatchEventImpl(Component.java:3678) at java.awt.Container.dispatchEventImpl(Container.java:1627) at java.awt.Window.dispatchEventImpl(Window.java:1606) at java.awt.Component.dispatchEvent(Component.java:3477) at java.awt.EventQueue.dispatchEvent(EventQueue.java:456) at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:201) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:151) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:145) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:137) at java.awt.EventDispatchThread.run(EventDispatchThread.java:100) �
mistä lie johtuu...
Kun paint-metodia kutsutaan ensimmäisen kerran kuva on vielä null.
Itse korjaisin sen jotenkin näin
package testeja; import java.awt.*; import javax.swing.*; import java.awt.Image.*; public class Kuva extends JFrame{ Image kuva; public Kuva(){ this.setSize(600,600); //this.setVisible(true); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); kuva = Toolkit.getDefaultToolkit().getImage("testi.jpg"); System.out.println(kuva); this.setVisible(true); //paint:iä kutsutaan heti tämän jälkeen } public void paint(Graphics g) { g.drawRect(100,100,200,200); if (kuva != null) g.drawImage(kuva, 100,100,this); } public static void main(String args[]){ Kuva kalle = new Kuva(); } }
Sitten kannattaa huomata, että yrität lada kuvaa koodihakemiston juuresta etkä suinkaan tuon 'testeja' paketin sisältä. Jos siis kuvasi on samassa hakemistossa tuon koodin kanssa, ei sitä pidäkään löytyä tuolla koodilla vaan joudut liittämään kuvan nimeen paketin mukaan (testeja/testi.jpg).
kääntäjä ei tosin enää valita, kiitokset siitä :), mutta if lause ei näytä olevan koskaan tosi - kun lisäsin siihen System.out.println("toimii"), niin sitä ei tule tuonne komentoriville.
netbeans kääntää nuo koodit jonnekkin muualle kuin missä koodit ovat. Olen itse aikoinaan ihmetellyt samaa ja vastausta ei ainakaan silloin netbeansille tullut muuta kuin käyttää kokonaisia osoitteita eli c:\koodit\kuvat\kuva1.jpg jne. tosin tämä ei enää toimi kun yrittää käännettyä ohjelmaa siirtää toiselle koneelle. Eclipsessä kuvat saa menee oikein projektiin kun vetää ja pudottaa kuvan tiedosto listaan.
laitoin sen kuvan nyt tallain:
kuva = Toolkit.getDefaultToolkit().getImage("c:\Paulus\kuvat\testi.jpg");
kääntäjä valitaa:
testeja/Kuva.java [14:1] illegal escape character kuva = Toolkit.getDefaultToolkit().getImage("c:\Paulus\kuvat\testi.jpg"); ^ testeja/Kuva.java [14:1] illegal escape character kuva = Toolkit.getDefaultToolkit().getImage("c:\Paulus\kuvat\testi.jpg"); ^ 2 errors Errors compiling Kuva.
Eskapoi kenoviivat, "c:\\Paulus\\kuvat\\testi.jpg". Kenoviivan avulla ilmaistaan kaikkea jännää stringin sisällä, eikä sitä siis yksinään voi laittaa sinne, tai esim "c:\moi"-stringissä luultaisiin että m:lle halutaan tehdä jotain mielenkiintoista.
kiitti kaverit, vihdoinkin toimi!
Kysynpä tässä samalla vielä yhtä asiaa:
MemoryImageSource lahde = new MemoryImageSource(leveys,korkeus,upixelit,0,leveys); Image kuva2=createImage(lahde);
symbol : method createImage (java.awt.image.MemoryImageSource) location: class Paulus.Apuluokat.Kuva Image screenImage=createImage(lahde); ^ 1 error Errors compiling Kuva.
oon kuullut, ettei kuulemma createImagea saa käyttää, mutta miten voisin tehdä tuosta MemoryImagesta kuvan?
Toolkit.getDefaultToolkit().createImage(lahde);
Toi saattaa toimia. Toisaalta harvemmin tuollaista kuvaa tarvitaan jonkin Component-luokan ulkopuolella, joten useimmiten se pelkkä createImage() toimii ihan hyvin.
Aihe on jo aika vanha, joten et voi enää vastata siihen.