Toon posts:

[JAVA] paintComponent wordt niet aangeroepen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Goed, daar ben ik weer...

Na een dag bezig te zijn geweest om een simpel plaatje te kunnen weergeven, werd duidelijk dat het plaatje met behulp van een drawImage gemaakt moest worden i.v.m. meerdere (transparante) 'cirkels' die later over de image geplaatst moeten worden.

Ik heb de volgende functie die een image ophaalt van de harde schijf: (kep bij de toolkit en bij de bufferedimage regels een enter geslagen om de tabel van got niet helemaal te vern**ken)

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
public void showChooser() {
    JFileChooser chooser = new JFileChooser();
    chooser.setAcceptAllFileFilterUsed(false);
    chooser.addChoosableFileFilter(new OwnFilter());
    int returnVal = chooser.showOpenDialog(this);
    if (returnVal == JFileChooser.APPROVE_OPTION) {
        img = Toolkit.getDefaultToolkit().getImage _
                  (chooser.getSelectedFile().getAbsolutePath());

        ImageIcon imageIcon = new ImageIcon(img);
        int imageHeight = imageIcon.getIconHeight();
        int imageWidth = imageIcon.getIconWidth();
            
        plaatje = new BufferedImage(imageWidth, imageHeight, _
                         BufferedImage.TYPE_INT_RGB);

                                // en hier moet er toch wat gebeuren dan?

        System.out.println(imageHeight + " " + imageWidth);
        //jLabel.setIcon(imageIcon);
        mapPanel.invalidate();
        mapPanel.validate();
        repaint();
    }
}


Ik haal dus een image op, zet deze in de Image variabele img. Dan zet ik deze zolang in een ImageIcon, zodat ik daar de hoogte en breedte van de image op kan halen. Dit werkt ook wel. Op de een of andere manier werkt het met img.getHeight(io) niet, dan krijg ik een -1 terug, wat errors veroorzaakt.

Goed, verder, ik zet hem in een BufferedImage, ik had gelezen dat dat beter met Graphics2D ofzo zou werken. Maar goed, dan nu mijn paint functie:

code:
1
2
3
4
5
6
7
public void paintComponent(Graphics g) {
    Graphics g2d = plaatje.createGraphics();
    //Graphics g2d = (Graphics)g;
    System.out.println("al hier geweest?!");
    g2d.drawImage(plaatje, 0, 0, io);
    g2d.dispose();
}


Ik maak hier dus een graphics object van plaatje, en die wil ik dus tekenen, maar hij beland al helemaal niet in deze functie, en als hij dat doet, dan krijg ik een NullPointerException, omdat g en g2d leeg zijn...

Het plaatje zou op een panel moeten komen. Verder is de constructor van deze class als volgt:

code:
1
2
3
4
5
public OpenFiles(JPanel mapPanel) {
    this.mapPanel = mapPanel;
    jLabel = new JLabel();
    mapPanel.add(jLabel, BorderLayout.NORTH);
}


Hoe kan ik nu in godsnaam dat plaatje afbeelden op het JLabel?? Ik ben het na meer dan 6 uur proberen wel zat nu :)

Iemand?

Verwijderd

Om de hoogte/breedte van een plaatje te kunnen bepalen wordt een observer gevraagd dit te bepalen. Is de variabele io in img.getHeight(io) bij jou de klasse die de interface ImageObserver implementeert ?

Verwijderd

Topicstarter
Verwijderd schreef op 12 September 2003 @ 10:22:
Om de hoogte/breedte van een plaatje te kunnen bepalen wordt een observer gevraagd dit te bepalen. Is de variabele io in img.getHeight(io) bij jou de klasse die de interface ImageObserver implementeert ?
Ja die declareer ik onder de start van de classa als volgt:

private ImageObserver io;

maar ongeacht dat, hij tekent gewoon de afbeelding niet.. hij komt niet in de paintComponent functie, en als ik die gewoon aanroep, wat dus niet zou moeten hoeven ( paintComponent(g); ), dan is g en g2d NULL en krijg ik een error..

Verwijderd

ImageObserver is toch een interface ? Die moet je zelf implementeren

Verwijderd

Topicstarter
Verwijderd schreef op 12 September 2003 @ 10:27:
ImageObserver is toch een interface ? Die moet je zelf implementeren
Mja, die zit in de AWT, en die importeer ik wel..

Verwijderd

Volgens mij ligt de fout bij jou implementatie van die interface. ImageObserver, http://java.sun.com/j2se/.../image/ImageObserver.html, heeft een methode imageUpdate en die moet je zelf implementeren.

Je zegt verder ook alleen maar "private ImageObserver io;" dus is de variabele io nog een null-reference. Vandaar dat je een run-time exception krijgt bij "g2d.drawImage(plaatje, 0, 0, io);"

Of zie ik dit nu verkeerd :?

Verwijderd

Topicstarter
Ik zal er eens naar kijken ja, maar dan, hoe zorg ik ervoor dat de functie paintComponent uberhaupt doorlopen wordt?

hm, maar het is een java.awt component, dus als ik java.awt.* implementeer dan zit de ImageObserver er toch automatisch bij?

Ik krijg namelijk ook geen errors als ik hem compileer..

[ Voor 45% gewijzigd door Verwijderd op 12-09-2003 10:59 ]


Verwijderd

Topicstarter
Hm, je hebt wel gelijk dat ie null is... maar wat moet ik er dan precies mee doen?

Verwijderd

De interface ImageObserver wordt ook door de klasse JPanel geimplementeerd:
http://java.sun.com/j2se/...i/javax/swing/JPanel.html
Je kunt jou variabele "io" dus ook vervangen door een reference naar je JPanel:

Verwijderd

Topicstarter
Ok, maar wat ik ook doe, hij roept niet automatisch paintComponent(Graphics g) aan... En hij drukt dus ook het plaatje niet af..

Verwijderd

Is de klasse waarin paintComponent is gedefineerd wel een Panel? Anders heeft die methode weinig nut. Wat je wil is de paint methode van een panel veranderen om er zo plaatjes in te tekenen.

Volgens mij moet je een eigen klasse maken die van een Panel extend. Op die manier kun je je eigen rotzooi tekenen door de paint(Graphics g) methode te overschrijven. Vergeet niet aan het einde van die methode ook weer de paint methode van de superklasse aan te roepen. Pseudo :

mijnpanel extends Panel {

...

paint (Graphics g) {
g.tekenPlaatje();
super(g);
}

...
}

Verwijderd

Is het je daarmee gelukt sunchaser ?

Verwijderd

Topicstarter
Verwijderd schreef op 12 september 2003 @ 14:41:
Is het je daarmee gelukt sunchaser ?
nee...

Ik herschrijf even mijn programma naar een wat duidelijker structuur...

ik moet namelijk mijn hoofdvenster onderverdelen in 2 gebieden, 1 gebied waar ik via radiobuttons kan kiezen voor cirkels of eclipsen, een gebied van 50 pixels hoog zeg maar, en de rest is voor de image.

Ik kijk nu even hoe ik het frame het beste op kan bouwen. Ik heb een void main met de Frame opbouw, en nu moet ik een panel daarop gaan plaatsen welke ik onder moet verdelen in die 2 gebieden. Daarbij komt, dat het onderste frame altijd zichtbaar moet zijn, maar ik moet er wel transparante cirkels overheen kunnen trekken.. Ik moet dus werken met JLayeredPane, ik zit alleen te zoeken of die image ook al in een layered pane moet...

Hm.. moeilijk als je dit nog nooit gedaan hebt...
Pagina: 1