Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Java: Kuvat näkyviin (java)

Sivun loppuun

Paulus M [19.03.2006 16:54:24]

#

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

FooBat [19.03.2006 18:16:43]

#

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

Paulus M [19.03.2006 19:47:20]

#

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.

panttu [20.03.2006 20:36:43]

#

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.

Paulus M [21.03.2006 15:30:29]

#

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.

sooda [21.03.2006 15:39:17]

#

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.

Paulus M [21.03.2006 15:41:19]

#

kiitti kaverit, vihdoinkin toimi!

Paulus M [21.03.2006 21:04:43]

#

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?

FooBat [21.03.2006 22:17:37]

#

Toolkit.getDefaultToolkit().createImage(lahde);

Toi saattaa toimia. Toisaalta harvemmin tuollaista kuvaa tarvitaan jonkin Component-luokan ulkopuolella, joten useimmiten se pelkkä createImage() toimii ihan hyvin.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta