Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Kuvan lataus frameen Javassa

Sivun loppuun

Mobel [16.12.2006 11:43:48]

#

En ole tietoinen onko tätä kyselty muun kuin JFramen osalta, mutta toivoisin saavani vastauksen seuraavaan ongelmaan.

Mitenhän onnistuisi java-appletissa kuvan lataaminen uuteen ikkunaan (frameen)? Eli ohjelmani toimii niin, että kun kuvaa klikataan sen pitäisi aueta uuteen frameen ja näkyä täysikokoisena. Olen kolunnut useampiakin aihetta käsitteleviä sivustoja, mutta en ole onnistunut saamaan vastausta.

Toivoisin esimerkkikoodia. Kiitokset!

FooBat [16.12.2006 20:59:24]

#

En ole tälläistä koskaan tehnyt ja aluksi ajattelin, että tuon ei pitäisi onnistua. Näyttää kuitenkin siltä appletista voidaan suorittaa javascript-koodia, jolla tuo pitäisi onnistua. Esimerkkikoodia ei nyt ole antaa, mutta tuolla oli jotain puhetta vastaavasta.
http://www.raditha.com/java/javascript.php

Voi tuohon olla jotain yksinkertaisempiakin ratkaisuja, mutta itse en ole kovin kokenut applettien kirjoittaja.

Mobel [17.12.2006 00:17:59]

#

Silmäilin sivun läpi, mutta en oikein tykästynyt ajatukselle käyttää JavaScriptiä appletissani, mutta kiitokset kuitenkin avusta ^^

Luultavasti tuo onnistuu, sillä googlettamalla löytyi tämä ( http://www.tanssiorkesteri.org/kuvat.html ) sivu. Tuon esimerkin mukainen selain olisi tarkoituksena räpeltää. Kaikki muu toimii paitsi kuvan lataaminen frameen.

FooBat [17.12.2006 01:15:26]

#

Tuo sinun linkki ei ole java-appletti vaan flash-sovellus, jolla on huomattavasti helpompi tehdä tuollaisia.

Mobel [17.12.2006 15:53:54]

#

Aivan. Niinpä onkin, mutta ainakin idea tuli selväksi.

Mobel [19.12.2006 16:26:42]

#

Eikö tämä todellakaan ole mahdollista? Vaikuttaako asiaan jos käyttäisinkin JFramea, onnistuuko API:lla(tuskin)? Ihmettelisin, jos tosiaan kielen rajoitteet tulevat tässä vastaan. Frameenhan on kuitenkin mahdollista piirtää muotoja, viivoja jne. Miksei siis kuvaa?

Tämän ongelman kanssa on tullut painiskeltua jo sen verran kauan, että toivoisin siihen vastauksen saavani.

PS. ToolBox on tullut usein esiin eri sivustoilla, mikähän kumma se on?

Blaze [19.12.2006 18:17:03]

#

Mobel kirjoitti:

Frameenhan on kuitenkin mahdollista piirtää muotoja, viivoja jne. Miksei siis kuvaa?

Tokihan (J)Frameen voi kuvan piirtää. Ylikuormittaa vaan paint-metodin ja käyttää drawImagea. Tässä nimenomaisessa tapauksessa on kuitenkin varmaan näppärämpää käyttää jotain komponenttia, joka osaa näyttää kuvan. Laittamalla sen JScrollPaneen ja tämän siihen JFrameen saa skrollauksen ilmaiseksi.

Kiinnostuin tästä sen verran, että rakensin tuollaisen: http://blaze.dyndns.ws/~blaze/applettimagetesti/

Edit: laitetaas nyt se koodiki tähän, niin tulee arkistoitua:

// ImageApplet.java
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ImageApplet extends Applet {
	JButton b1, b2, b3;

	public void init() {
		// purkka++
		// pari nappia, joista saa näkymään kuvan
		b1 = new JButton("1");
		b1.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				showImg("1");
			}
		});
		b2 = new JButton("2");
		b2.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				showImg("2");
			}
		});
		b3 = new JButton("3");
		b3.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				showImg("3");
			}
		});
		this.add(b1);
		this.add(b2);
		this.add(b3);
	}

	public void showImg(String name) {
		// ladataan siitä hakemistosta, jossa tämä class-tiedosto
		// sijaitsee parametrin mukainen tiedosto ja annetaan se
		// parametriksi ShowImage-konstruktorille
		new ShowImage(this.getImage(this.getCodeBase(), name + ".jpg"));
	}
}
// ShowImage.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class ShowImage extends JFrame {
	private JLabel image;
	private JScrollPane scroll;

	public ShowImage(Image image) {
		// käytetään jlabelia näyttämään se kuva
		this.image = new JLabel(new ImageIcon(image));
		// ja pukitaan se vielä scrollpanen sisään
		this.scroll = new JScrollPane(this.image);
		this.add(scroll);
		this.pack();
		this.setVisible(true);
	}
}

FooBat [19.12.2006 18:33:22]

#

Kappas, en ole tullut ajatelleeksi, että appletista voisi avata uusia ikkunoita, mutta en tosiaan ole montaa applettia tehnytkään.

Hmm, jostain syystä tuo appletti veti firefoxini aikas jumiin appletin sulkemisenkin jälkeen. Jäiköhän se jotenkin päälle vai bugaakohan ff ihan itse.

Mobel [19.12.2006 18:49:34]

#

Jepa!
Lähtihän se toimiin! Kiitos vaan Blazelle ja FooBatille, jotka jaksoivat tuskailla ongelman kanssa ja tietty jaella vinkkejä! Tosiaan mahtavaa saada tuo toimimaan viikkojen väännön jälkeen!

to Blaze:
Erittäin hyvä vinkki kivoilla kuvilla ^^

Ja ai niin. Onko Framella jotain rajoituksia verrattuna JFrameen, kun ei Framella kerran onnistu(vai onnistuuko)?

PS. Laitan oman version jossain vaiheessa nettiin kunhan saan tilaa jostain...

PSS. Tässä vielä oma lähestymistapani asiaan:

//jostain täältä kutsutaan metodia
ruutu();

public void ruutu(){ //framen olen kirjoittanut yhteen "pääkoodin" kanssa

        String title = nimi; //nimi
        Frame ruutu = new Frame(title);
        ruutu.setIconImage(img); //kuva perittiin pääohjelmalta
        int leveys = 300; //koko. testivaiheessa vielä pieni
        int korkeus = 300;
        ruutu.setResizable(false); //ei voi muuttaa kokoa
        ruutu.setSize(leveys, korkeus); //muutetaan koko oikeaksi
        ruutu.setVisible(true); //halutaan varmaan myös nähdä frame

        //tähän pitäisi keksiä miten kuvan saa näkymään
        /*esim. Blazen tyyli (ei tosin tässä tapauksessa toimi)
        public ShowImage(Image image) {
        // käytetään jlabelia näyttämään se kuva
        this.image = new JLabel(new ImageIcon(image));
        // ja pukitaan se vielä scrollpanen sisään
        this.scroll = new JScrollPane(this.image);
        this.add(scroll);
        this.pack();
        this.setVisible(true);
        }
        */

        ruutu.addWindowListener(new WindowAdapter() { //lisätään kuuntelija sulkemisnapille
            public void windowClosing(WindowEvent evt) { //jos sitä satutaan painamaan...
                Frame ruutuikkuna = (Frame)evt.getSource();
                ruutuikkuna.dispose(); //...se menee kiinni
            }
        });


    }

Blaze [19.12.2006 19:08:24]

#

FooBat kirjoitti:

Hmm, jostain syystä tuo appletti veti firefoxini aikas jumiin appletin sulkemisenkin jälkeen. Jäiköhän se jotenkin päälle vai bugaakohan ff ihan itse.

java_vm-prosessi jäi kyllä päälle vielä tuon tabin sulkemisen jälkeenkin. Jumiin en kyllä Firefoxia saanu.

Mobel kirjoitti:

Ja ai niin. Onko Framella jotain rajoituksia verrattuna JFrameen, kun ei Framella kerran onnistu(vai onnistuuko)?

Voit vaihtaa tuon JFramen Frameksi ja homma pelaa edelleen.
<edit> Spoke too early. Homma toimii edelleen, paitsi että sitä ikkunaa ei saa suljettua kun Framella ei ole oletustapahtumakäsittelijää tuolle ruksille :P
Sellaisen lisäämisen jälkeen tuo toimisi samalla tavalla.</edit>
Oon vaan leikkiny enemmän Swingin kanssa, ja JScrollPanelle ei (tietääkseni) ole AWT-vastinetta, niin Swingiä joutuu kuitenkin käyttämään.

Mobel [19.12.2006 20:50:40]

#

Vaivaampa vielä vähän ;)
En saanut tätä pätkää toimimaan omassa koodissani. Luultavasti sitä tarvitaan tässä joten laitan kohta sorsaan linkin (ellei joku keksi vikaa muuten vaan). Olen tehnyt uuden tiedoston ja se on samassa kansiossa jne. kääntäjä vaan herjaa, että se ei ymmärrä "ShowImage"-kohtaa.

new ShowImage(this.getImage(this.getCodeBase(), name + ".jpg"));

Eh... mitä tämä edes tekee? Avaa uuden tiedoston, mutta löytyykö infoa tästä aiheesta(tiedoston avaamisesta)?

Blaze [19.12.2006 21:10:16]

#

Se luo uuden ShowImage-tyyppisen olion, ja antaa sen rakentajalle parametriksi Image-tyyppisen olion, joka ladataan tiedostosta Appletin getImage()-metodilla.
Tuo ShowImage on siis mun ite JFramesta laajentamani luokka, jonka koodi on tuossa yllä näkyvissä.

Mobel [19.12.2006 23:35:24]

#

Kiitos suuresti edellisistä (useista) vastauksistasi!
Luultavastikkin erittäin tyhmä kysymys: Miten tuo antamasi lähdekoodi saadaan tomimaan? ^^

Eli tein näin:
Kopioin ensimmäisen tiedoston JBuilderiin. Tallensin sen ImageApplet nimellä. Tein uuden tiedoston samaan projektiin ja kopioin ShowImage-lähdekoodin siihen (tallensin tietty samalla nimellä). Kääntäjä ei edelleenkään usko riviä

 new ShowImage(this.getImage(this.getCodeBase(), name + ".jpg"));

vaan herjaa: "ImageApplet.java": cannot find symbol; symbol : ShowImage, location: class ImageApplet at line 40, column 13

Kiitokset kärsivällisyydestäsi

Blaze [20.12.2006 00:02:35]

#

Mobel kirjoitti:

Kopioin ensimmäisen tiedoston JBuilderiin. Tallensin sen ImageApplet nimellä. Tein uuden tiedoston samaan projektiin ja kopioin ShowImage-lähdekoodin siihen (tallensin tietty samalla nimellä).

En oo JBuilderia koskaan käyttäny, mut noin ton luulis toimivan :/

Minä käänsin nuo niin, että molemmat tiedostot samaan hakemistoon ja komensin 'javac ImageApplet.java'. Kääntäjä oli tarpeeksi fiksu huomatakseen, että sen ShowImagen koodi on siellä samassa hakemistossa ja sekin pitää kääntää.

Mobel [30.12.2006 17:28:09]

#

Taas on javaa jauhettu useampi viikko, enkä ole omalla kääntäjällä saanut ohjelmaa toimimaan. Ongelma on siinä, että kääntäjä ei ymmärrä viittaustani edellä mainitsemallani koodilla toiseen tiedostoon.

Ihmettelenkin siis:
Miten saan avattua uuteen frameen kuvat yhdessä tiedostossa? Tietysti tämä onnistuisi kääntäjän kanssa temppuilulla, mutta sitä EI ENÄÄ JAKSA!

Jos tämä on mahdollista, niin apua tarvitaan.

maka78 [05.01.2007 13:29:58]

#

hmm ihan kysymyksenä että miksi et käytä JDialog:ia JFramen sijaan?

Mobel [05.01.2007 21:56:37]

#

Ihan vaan vastauksena, että en taida tätä hallita ;)

Pitääpä etsiä infoa tuosta aiheesta, ellei sinulla ole tarjota esimerkkikoodia tuosta keinosta. Kiitokset vinkistä!

FooBat [05.01.2007 23:06:48]

#

Etkö voi vain tehdä useammasta kooditiedostota jar-pakettia, jonka voi sitten pistää siihen applet-tagin 'archive' kohtaan ja 'code' pistää sen aloitusluokan nimen.

Jar-paketin voi luoda esim. näin:

jar -cvf paketti.jar *.class

Sivun alkuun

Vastaus

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

Tietoa sivustosta