[java] plaatje vervangen voor ander plaatje

Pagina: 1
Acties:

  • twilightschild
  • Registratie: December 2003
  • Laatst online: 23-05 07:39
Voor een GUI die ik geschreven heb wil ik een plaatje van een brandend lampje kunnen vervangen voor een plaatje van een niet brandend lampje (nee, das niet alles wat het programma doet ;))
Ik heb alleen voor het veranderen van het plaatje even een programmatje geschreven. Aangezien ik in een ander topic commentaar kreeg dat t niet te volgen was, heb ik het deze keer geprobeerd zo net mogelijk op te stellen. Als het nu nog niet te volgens is, mijn excuses; Na een half jaar Java besloot mijn school dat C toch een betere taal was, dus ik probeer het zo goed mogelijk te doen met een boek en de API.

Het programma:
Java:
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
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;

class MainImageCanvas
{
    public static void main (String [] arg)
    {
        mooiFrame mf = new mooiFrame();
    }
}

  class mooiFrame extends Frame implements ActionListener
  {
     Image lampaan = Toolkit.getDefaultToolkit().createImage("e:\\lightbulb.gif");//images aanmaken
     Image lampuit = Toolkit.getDefaultToolkit().createImage("e:\\lightbulboff.gif");
     ImageCanvas ic;//images in canvas zetten
     Button b1 = new Button("Ok");



     mooiFrame()
      {
          setLayout(new GridLayout(2,1,5,5));
          ic = new ImageCanvas(lampaan);
          add(ic);
          add(b1);
          pack();
          setVisible(true);
          b1.addActionListener(this);
      }

  public void actionPerformed(ActionEvent e)
  {
      if(e.getSource() == b1)
      {
          ic.setImage(lampuit);
          this.repaint();
          pack();


      }
  }
}


  class ImageCanvas extends Canvas  {
  private Image im;

  public void setImage(Image img)
  {
      im = img;
  }

  public ImageCanvas(Image img) {
    im=img;
    repaint();
  }

   public void paint(Graphics g)
   {
       g.drawImage(im, 0, 0, this);
  }


}


Het tekenen van het plaatje gaat gewoon goed, maar als ik op de knop druk verandert er niks. De bedoeling is dat ImageCanvas de image lampuit gaat bevatten. Ik heb geen idee hoe ik dit moet doen en ik kan er ook niets over vinden op GOT of via google.
De vraag is dus eigenlijk hoe ik het ImageCanvas nog aan kan passen nadat de t object gemaakt is.
Wat wel lukt is om alle componenten uit het frame te gooien, de andere image in ImageCanvas ic te laden en dan de ImageCanvas en de Button er weer in te zetten, maar dit wordt bij het programma waar ik het in ga gebruiken redelijk omslachtig en het ziet er ook niet uit.
Het lijkt me dat iets als dit behoorlijk simpel moet zijn, maar ik heb dus gewoon geen enkel idee hoe ik het moet doen.

Bvd
java-n00b

[ Voor 4% gewijzigd door twilightschild op 18-04-2004 21:46 ]


Verwijderd

verander je code tag even naar code=java :)

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 15:28

Robtimus

me Robtimus no like you

Je creeert een nieuw canvas maar verwijdert je oude niet en voegt je nieuwe niet toe.

Geef je canvas een method "setImage" waarmee je de image zet oid. Vind ik een nettere manier dan verwijderen en weer toevoegen.
Java:
1
2
3
4
public void setImage(Image img)
{
    im = img;
}
Je hebt dan een reference naar het plaatje dat je wilt tekenen; je paint gebruikt die dan.

[ Voor 30% gewijzigd door Robtimus op 18-04-2004 21:41 ]

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Verwijderd

IceManX was weer te snel voor mij om mijn verhaal af te maken, ik wilde nl hetzelfde voorstellen :)


ook nog ff dit fixxen:

Java:
1
2
3
4
5
6
7
  public void actionPerformed(ActionEvent e)
  {
      if(e.getSource() == b1)
      {
          ic.setImage(lampuit);
      }
  }

[ Voor 7% gewijzigd door Verwijderd op 18-04-2004 21:45 ]


  • twilightschild
  • Registratie: December 2003
  • Laatst online: 23-05 07:39
Ik heb het programma aangepast (staat hierboven ook), maar het werkt nog steeds niet.
Mijn klomp blijft maar breken met dat java :P

Verwijderd

Java:
1
2
3
4
  public void setImage(Image img) {
    im=img;
    repaint();
  }


en weet je zeker dat het tweede plaatje bestaat?

Zo moeilijk is het niet te begrijpen hoor, je moet nl ergens een repaint() doen, om het resultaat van de verandering te tonen. Ik zo ervoor kiezen om dat in de setimage te doen, omdat dat het enige is dat veranderd.

MAAR, als er meer veranderd is het wellicht beter om pas te repainten nadat alle verandecingen vijn doorgevoerd.

En als je het echt mooi (flikkervrij) wilt hebben, moet je eens gaan zoeken naar "double buffering"

[ Voor 68% gewijzigd door Verwijderd op 18-04-2004 22:07 ]


  • twilightschild
  • Registratie: December 2003
  • Laatst online: 23-05 07:39
Ahhh, het werkt.
Ik had na jullie tips per ongeluk gewoon repaint aangeroepen en niet ic.repaint.
Bedankt allemaal!

  • 12_0_13
  • Registratie: April 2004
  • Laatst online: 12-02 13:19
?

Ik dacht dat repaint() recursief ook alle childeren repaintte.. Ik kan het nu niet even testen, maar ik probeer het vanavond nog wel even
Pagina: 1