[java] Tekenen in een panel

Pagina: 1
Acties:

  • Rempage0611
  • Registratie: December 2000
  • Laatst online: 23-09-2025

Rempage0611

9405 WP @ 2x SMA Sunny Boy

Topicstarter
Ik heb in een java applet een panel genaamd levelPanel, hieronder een paar stukjes relevante code

import javax.swing.*;
code:
1
2
3
4
5
6
7
8
9
10
11
12
public class racen extends Applet implements Runnable
   {

   JPanel levelPanel;

   public void init ()
     {
     levelPanel = new JPanel();
     levelPanel.setPreferredSize(new Dimension(640,480));
     add(levelPanel);     
     levelPanel.add(loop = new Button ( "loop"));
     levelPanel.add (loop);

Dit werkt top, alleen wil ik ook kunnen tekenen op een panel. Dit doe ik op de volgende manier:
code:
1
2
3
public void paint ( Graphics g ){
   levelPanel.add(g.drawImage(buffer,0,0,640,480,this));
   }

Maar dit werkt niet. Moet dit op een andere manier of kan je niet tekenen in Panels?

Thnx.

  • MisterData
  • Registratie: September 2001
  • Laatst online: 07-09 20:23
Kan ik me voorstellen !! de drawImage methode stuurt nix terug, dus is er ook nix om te adden !! Je moet het zo oplossen :
code:
1
2
3
4
public void paint(Graphics g) {
  Graphics panelGraphics = panel.getGraphics();
  panelGrapics.drawImage();
}

Bij drawImage moeten nog een paar params maar dat had je natuurlijk al gezien ;)

Je moet dus eerst de Graphics opvragen van dat panel voordat je gaat tekenen. Als je gaat tekenen dan moet je dus tekenen naar de graphics die je net van dat panel hebt opgevraagd :)

Verwijderd

eeuh, mischien je Panel extenden met je eigen versie

bijv zoiets als

[code]
public class mijnPanel extends jpanel
{
public mijnPanel()
{ super; bla; }

public void pain(Graphics g)
{
tekenen;
}
}

  • MisterData
  • Registratie: September 2001
  • Laatst online: 07-09 20:23
Nog netter is het als je gewoon een eigen component maakt, dus niet vanaf een panel, maar bijv. extenden van een Canvas. dus zo :
code:
1
2
3
4
5
6
7
8
9
10
 public class Plaatje extends Canvas {
  Image img; 
 public Plaatje(String naam) {
   img = getImage(naam);
  }

 public void paint(Graphics g) {
   g.drawImage(img);
 }
 }

veel netter... als je een plaatje ergus wil hebben, doe je gewoon zo :
code:
1
2
Plaatje mijnPlaatje = new Plaatje("iets.gif");
paneel.add(mijnPlaatje);

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je kan met een ImageIcon en een JLabel veel makkelijker een plaatje invoegen... Als je alleen het plaatje wilt weergeven is al dat geklieder helemaal niet nodig.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • MisterData
  • Registratie: September 2001
  • Laatst online: 07-09 20:23
Ow ja, klopt :) Maar alleen in Swing of ook met de 'gewone' awt ??? Ik heb een dergelijke functie daarin nog niet gevonden :?

  • Rempage0611
  • Registratie: December 2000
  • Laatst online: 23-09-2025

Rempage0611

9405 WP @ 2x SMA Sunny Boy

Topicstarter
Hij werkt dus nu wel in de Jbuilder applet viewer, maar niet in Iexplorer 6...

De fout komt voor bij de volgende regel:

add(levelPanel);


Hieronder de debug info van de java console in Iexplorer
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
com.ms.security.SecurityExceptionEx[racen.init]: java.io.IOException: bad path: D:\Java\Spel met panels\classes\javax\swing\JPanel.class
    at com/ms/security/permissions/FileIOPermission.check
    at com/ms/security/PolicyEngine.deepCheck
    at com/ms/security/PolicyEngine.checkPermission
    at com/ms/security/StandardSecurityManager.chk
    at com/ms/security/StandardSecurityManager.checkRead
    at java/io/File.isDirectory
    at sun/net/www/protocol/file/FileURLConnection.connect
    at sun/net/www/protocol/file/FileURLConnection.getInputStream
    at com/ms/vm/loader/ResourceLoader.getURLData
    at com/ms/vm/loader/ResourceLoader.getCodebaseRelativeData
    at com/ms/vm/loader/ResourceLoader.getClassData
    at com/ms/vm/loader/URLClassLoader.findClass
    at com/ms/vm/loader/URLClassLoader.loadClass
    at java/lang/ClassLoader.loadClassInternal
    at racen.init
    at com/ms/applet/AppletPanel.securedCall0
    at com/ms/applet/AppletPanel.securedCall
    at com/ms/applet/AppletPanel.processSentEvent
    at com/ms/applet/AppletPanel.processSentEvent
    at com/ms/applet/AppletPanel.run
    at java/lang/Thread.run
java.lang.ClassNotFoundException: javax.swing.JPanel
    at com/ms/vm/loader/URLClassLoader.loadClass
    at java/lang/ClassLoader.loadClassInternal
    at racen.init
    at com/ms/applet/AppletPanel.securedCall0
    at com/ms/applet/AppletPanel.securedCall
    at com/ms/applet/AppletPanel.processSentEvent
    at com/ms/applet/AppletPanel.processSentEvent
    at com/ms/applet/AppletPanel.run
    at java/lang/Thread.run
java.lang.ClassNotFoundException: javax.swing.JPanel
    at com/ms/vm/loader/URLClassLoader.loadClass
    at java/lang/ClassLoader.loadClassInternal
    at racen.init
    at com/ms/applet/AppletPanel.securedCall0
    at com/ms/applet/AppletPanel.securedCall
    at com/ms/applet/AppletPanel.processSentEvent
    at com/ms/applet/AppletPanel.processSentEvent
    at com/ms/applet/AppletPanel.run
    at java/lang/Thread.run

Er vaag dat ie het in de applet viewer wel doet, en in Iexplorer niet :?

Ik zie het niet.

  • Rempage0611
  • Registratie: December 2000
  • Laatst online: 23-09-2025

Rempage0611

9405 WP @ 2x SMA Sunny Boy

Topicstarter
Het gaat denk fout omdat ie de volgende url niet kan vinden.... dus ik ga nu maar ff JPanel.class copien naar de onderstaande map

D:\Java\Spel met panels\classes\javax\swing\

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je kan vanuit een Applet in principe geen bestanden van de computer van de gebruiker benaderen. Je moet de images op dezelfde server als je applet zetten en benaderen als urls, niet als files.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Rempage0611
  • Registratie: December 2000
  • Laatst online: 23-09-2025

Rempage0611

9405 WP @ 2x SMA Sunny Boy

Topicstarter
Hmm die is er dus niet, ook niet als ik alle packages unzip.... :'(

  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Oh je gebruikt ook de MS Java VM. Deze is (incompatible ;) ) met 1.1.4. Swing is pas geintroduceerd in Java 2, oftewel SDK versie 1.2. Je moet zorgen dat IE de Java Plugin gaat gebruiken.

Het beste kan je dat doen door de HTML converter te gebruiken. Deze zet Applet tags (die deprecated zijn) om naar Object en Embed tags. Deze verwijzen naar de Java Plugin. De HTML converter zit in de Java 2 SDK 1.3.

Als je de nieuwe Java 2 SDK hebt ( http://java.sun.com/getjava/download.html voor 1.3.x of http://java.sun.com/j2se/1.4/ voor 1.4 beta 3 ) wordt de Java Plugin al automatisch geinstalleerd in IE 6.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • Rempage0611
  • Registratie: December 2000
  • Laatst online: 23-09-2025

Rempage0611

9405 WP @ 2x SMA Sunny Boy

Topicstarter
Thnx! hij doet het nu in Iexplorer!

Maareuh... nu heb ik weer een ander probleem... Geheugenlekje...

Ik heb
code:
1
2
3
4
 public void destroy() {
      bufferG.dispose();
      panelGraphics.dispose();
     }

Al toegevoegd, maar dit helpt niet.


Ik begin een beetje onlogisch hier van te worden :)

Verwijderd

referenties op null zetten en system.gc() aanroepen? Gegarandeerd al je rottige java objectjes naar z'n mallemoer.

  • Rempage0611
  • Registratie: December 2000
  • Laatst online: 23-09-2025

Rempage0611

9405 WP @ 2x SMA Sunny Boy

Topicstarter
Opgelost!
code:
1
2
3
panelGraphics = levelPanel.getGraphics();
panelGraphics.drawImage(buffer,0,0,640,480,this);
panelGraphics.dispose();

De laatste regel is de oplossing!
Pagina: 1