Toon posts:

[JAVA] weergeven van een afbeelding

Pagina: 1
Acties:
  • 267 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hallo allemaal,

Ik ben al enige tijd bezig geweest om een afbeelding op een javaframe te zetten.
Ik had het eerst werken in een applet form, maar toen ik dat wou omzetten naar een applicatie werkte het niet meer. Dat kwam doordat je de getImage van een applet niet kan gebruiken in een applicatie (frame).
Na wat zoek werk kwam ik erachter dat het toolkit.getImage() moest worden.

nu kan ik mijn programma zonder error's compilen, maar wanneer ik op de knop druk om het speelveld te laten weer te geven gebeurt er niets. Ik krijg dan in mijn dosboxje op de achtergrond geen foutmelding te zien.

Ik heb got, google en een aantal sites met java informatie doorzocht, maar heb het niet kunnen vinden of eroverheen gelezen.

Weet iemand wat er mis gaat?
Wanneer ik in public afbeelding() onderaan tekenSpelbord() aanzet (het comentaar weghaal) kan ik probleemloos compile, maar wanneer ik hem draai krijg ik een "Exception in thread "main" java.lang.NullPointerException".
Maar die melding is zo vaag dat ik niet weet wat ik ermee moet.

het mooist zou zijn als ik de afbeelding in een panel kan zetten en die dan rechts kan alignen. het panel en alignen lukt wel, maar ik krijg dan precies het zelfde probleem als wat ik nu heb.

even over mijzelf. Ik ben net een kleine 6 weken bezig met java voor school en maak gebruik van jCreator en j2sdk1.4_01


code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
import java.awt.*;
import java.awt.event.*;

class Afbeelding extends Frame implements ActionListener
{
    //container voor de afbeelding
    private Image image;
    //buttons
    private Button btnTekenSpeelveld;
    private Button btnEnd;
    //panel voor de knopen
    private Panel pnlButtons;
    //panel voor de afbeelding
    private Panel pnlSpeelveld;    

    public Afbeelding() 
    {
        //maak de toolkit om de image op te halen
        Toolkit toolkit = Toolkit.getDefaultToolkit();
        image = toolkit.getImage("speelbordklein.jpg");
        //wacht tot de image goed is geladen en ga daarna pas verder
        MediaTracker mediaTracker = new MediaTracker(this);
        mediaTracker.addImage(image, 0);
        try
        {
            mediaTracker.waitForID(0);
        }
        catch (InterruptedException ie)
        {
            System.err.println(ie);
            System.exit(1);
        }
        //maak een knop aan
        btnTekenSpeelveld = new Button("Teken Speelveld");
        add(btnTekenSpeelveld); 
        btnTekenSpeelveld.addActionListener(this);
        //maak een knop aan
        btnEnd = new Button("Einde");
        add(btnEnd);
        btnEnd.addActionListener(this);
        //maak een panel waarin de 2 bovenstaande knoppen ingezetworden
        pnlButtons = new Panel(new FlowLayout(FlowLayout.CENTER));
        pnlButtons.add(btnTekenSpeelveld);
        pnlButtons.add(btnEnd);
        add(pnlButtons, BorderLayout.SOUTH);   
        
        //windowslistener om venster af te sluiten
        addWindowListener(new WindowAdapter() 
        {
            public void windowClosing(WindowEvent e) 
            {
                System.exit(0);
            }
        });
        
        //roep het teken speelveldaan zodat het speelveld getekents wordt
        //hieronder moet eigenlijk tekenspeelbord aangeroepen worden, maar
        //aangezien het niet werkt heb ik het maar in commentaar gezet en doe ik het
        //via een knop
        //tekenSpelbord();
    }

    public static void main(String args[]) 
    {
        System.out.println("Starting Afbeelding...");
        Afbeelding mainFrame = new Afbeelding();
        mainFrame.setSize(800, 600);
        mainFrame.setTitle("bordspel");
        mainFrame.setVisible(true);
    }

    public void tekenSpelbord()
    //-teken het miniatuur bord rechtsboven in de hoek
    //-teken het tekstvak
    {
       //zet de speelveld afbeelding in de variabele
        Graphics g = getGraphics();
        g.drawImage(image, 275, 25, 500, 331, null);
    }

    public void actionPerformed(ActionEvent event)
    {
       if(event.getSource() == btnTekenSpeelveld)
       {
           this.tekenSpelbord(); 
       } 
       
       if(event.getSource() == btnEnd)
       {
           afsluiten();
       }
    }
    
    public void afsluiten()
    {
           System.exit(0); 
    }
}

[ Voor 4% gewijzigd door Verwijderd op 30-10-2003 19:07 ]


  • MrBucket
  • Registratie: Juli 2003
  • Laatst online: 29-10-2022
't Is al weer een tijdje geleden dat ik hiermee heb gespeeld, maar ik geloof dat het probleem erin zit dat getGraphics() een null-waarde returned zolang de applet nog niet zichtbaar is.
Vanaf de eerste paint zal getGraphics() een geldig Graphics object retourneren waar je mee kunt werken.

De truc is dan ook om te wachten op de eerste paint-opdracht (bijv door deze methode te overriden, en je tekenopdrachten te doen als dit de eerste paint-opdracht van de applet is).

  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
Verwijderd schreef op 30 oktober 2003 @ 19:05:
Weet iemand wat er mis gaat?
Wanneer ik in public afbeelding() onderaan tekenSpelbord() aanzet (het comentaar weghaal) kan ik probleemloos compile, maar wanneer ik hem draai krijg ik een "Exception in thread "main" java.lang.NullPointerException".
Maar die melding is zo vaag dat ik niet weet wat ik ermee moet.
Als ik het zie zijn er de volgende problemen:
• Je Graphicsobject is null als je de constructor van het object aanroept, namelijk bij het bouwen van het frame. Het graphicsobject zal pas bestaan als er wat getekend is. Dus waarom niet de methode aanroep in de paintComponent() methode zetten? (wel even super.paintComponent() aanroepen, omdat je anders problemen krijgt met het tekenen van het Frame)
• Bij de button oplossing wordt iets toegevoegd nadat er getekend is. Waarschijnlijk zie je de boel wel als je je scherm van grootte veranderd/resized, omdat dan de boel opnieuw getekend wordt.

Zou je trouwens geen JLabel gebruiken om de image op te zetten? Daar is hij namelijk voor :) Lees maar

Verwijderd

Topicstarter
Ik ben, naar aanleiding van Gimli, opzoek gegaan naar de syntax voor een JPanel
ik heb het onderstaande stukje code gemaakt en die geplaatst bij regel 46 (zie eerste post). Wanneer ik nu compile krijg ik de fout:

cannot resolve symbol
symbol: constructor JLabel(java.lang.string, java.awt.image, int)
location: class javax.swing.JLabel
Jlabel label1 = new JLabel("", image, JLabel.CENTER);
^

Wat ik wil bereiken is dat ik een afbeelding in een doormij gedefineerde plaats wordt weergegeven (rechtsboven in de hoek)

ik heb zelf voorbeeldcode gehaald van http://java.sun.com/docs/...ing/components/label.html
en die code enkel aangepast aan mijn variable, maar dan krijg ik dus de bovenstaande foutmelding.
Oh, het staat niet in de code van mijn 1ste post, maar ik heb nu ook javax.swing.* geimporteert. ook heb in geprobeert om javax.swing.JPanel te importeren, maar dat maakte niets uit.


code:
1
2
3
4
5
        JLabel label1 = new JLabel("", image, JLabel.CENTER);
        //Set the position of the text
        label1.setVerticalTextPosition(JLabel.BOTTOM);
        label1.setHorizontalTextPosition(JLabel.CENTER);
        add(label1);

Verwijderd

Verwijderd schreef op 31 oktober 2003 @ 13:36:
cannot resolve symbol
symbol: constructor JLabel(java.lang.string, java.awt.image, int)
location: class javax.swing.JLabel
Jlabel label1 = new JLabel("", image, JLabel.CENTER);
^
Je geeft de constructor een string, een image en een int mee terwijl die een string, een icon en een int nodig heeft. Even van je image een icon maken dus.

Verwijderd

Hoi, het probleem is erg simpel.

Je krijgt een NULL-pointer. Waar? Op je referentie (g) naar het Graphics object.
Dat gebeurd omdat je met de regel "Graphics g = getGraphics();" probeert een Graphics object te maken.
Maar dat object moet je relateren aan je Frame.
Dat lukt hier niet. Wel als je de regel "Graphics g = mainFrame.getGraphics();"
zou kunnen gebruiken, maar in je huidige opzet gaat dat niet.

Met getGraphics() bewandel je de moeilijke weg. Er is geen automatisch repaint als deze applicatie bedekt is geweest door een ander window.

En nu de oplossing: overwrite de methode paint() van de Frame class. Je getGraphics reference wordt automatisch gedaan en aan het juiste frame gekoppeld. En je krijgt automatisch verversing van je applicatie.

Ik heb je button en eventhandler verwijderd aangezien je dat niet meer nodig hebt zoals ik jou verhaal begrijp..

Overigens: let op dat je huidige path naar je image niet werkt!!! Juist is:
image = toolkit.getImage("C:\\imagenaam.jpg");

Hier is de werkende source.
Ik heb je button en event verwijderd aangezien je dat niet meer nodig hebt naar mijn mening.

import java.awt.*;
import java.awt.event.*;

class Afbeelding extends Frame implements ActionListener
{
//container voor de afbeelding
private Image image;
//buttons
private Button btnEnd;
//panel voor de knopen
private Panel pnlButtons;
//panel voor de afbeelding
private Panel pnlSpeelveld;

public Afbeelding()
{ System.out.println("constructor");
//maak de toolkit om de image op te halen
Toolkit toolkit = Toolkit.getDefaultToolkit();
image = toolkit.getImage("C:\\Documents and Settings\\Administrator\\My Documents\\My Pictures\\aFamigghia1.jpg");
//wacht tot de image goed is geladen en ga daarna pas verder
MediaTracker mediaTracker = new MediaTracker(this);
mediaTracker.addImage(image, 0);
try
{
mediaTracker.waitForID(0);
}
catch (InterruptedException ie)
{
System.err.println(ie);
System.exit(1);
}

//maak een knop aan
btnEnd = new Button("Einde");
add(btnEnd);
btnEnd.addActionListener(this);
//maak een panel waarin de 2 bovenstaande knoppen ingezetworden
pnlButtons = new Panel(new FlowLayout(FlowLayout.CENTER));
pnlButtons.add(btnEnd);
add(pnlButtons, BorderLayout.SOUTH);

//windowslistener om venster af te sluiten
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
});

}

public static void main(String args[])
{
System.out.println("Starting Afbeelding...");
Afbeelding mainFrame = new Afbeelding();
mainFrame.setSize(800, 600);
mainFrame.setTitle("bordspel");
mainFrame.setVisible(true);

}

public void actionPerformed(ActionEvent event)
{
if(event.getSource() == btnEnd)
{
afsluiten();
}
}

public void afsluiten()
{
System.exit(0);
}

public void paint(Graphics g)
{
g.drawImage(image, 275, 25, 500, 331, null);
}
}

Groeten
Alexander

[ Voor 5% gewijzigd door Verwijderd op 01-11-2003 15:06 ]


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Verwijderd schreef op 31 oktober 2003 @ 15:25:
[...]

Je geeft de constructor een string, een image en een int mee terwijl die een string, een icon en een int nodig heeft. Even van je image een icon maken dus.
Sorry, maar het probleem ligt heel ergens anders, Namelijk dat de compiler Jlabel niet kent. Dat klopt. Want het moet JLabel zijn.


Als je netjes een Image wilt laden zul je een MediaTracker moeten gebruiken.

Verwijderd

Topicstarter
Alwoude,

hartelijk bedankt voor je hulp, het werkt nu precies zoals ik het wou.
dank je wel voor je hulp en je duidelijke uitleg. naast het oplossen van het probleem heb ik ook weer wat een beetje meer inzicht gekregen op de werking van java.

en natuurlijk de rest ook.

[ Voor 6% gewijzigd door Verwijderd op 02-11-2003 22:13 ]


  • FlowDesign
  • Registratie: Januari 2002
  • Nu online
Dit is echt zo'n beetje de enige manier die wel goed werkt, bedankt alex! :)

Mustang Mach-E SR RWD | MINI Countryman (F60) Cooper S (Stage 1 tuned)

Pagina: 1