Toon posts:

[Java] Image in applet tekenen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Waarschijnlijk een echt beginnersvraag, ik hoop dat jullie 'm kunnen beantwoorden! Ik heb een applet geschreven dat een jpg plaatje op het applet moet tekenen. Hier onder de code:
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
import java.io.File;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import java.awt.Graphics2D;

public class Main extends javax.swing.JApplet {

    public Main() {
      initComponents();
      drawImage();
    }

    private void initComponents() {
      getContentPane().setLayout(null);   
    }

    private void drawImage() {
      try {
        File f = new File("c:\\test.jpg");
        BufferedImage bi = ImageIO.read(f);
        Graphics2D biContext = bi.createGraphics();
        biContext.drawImage(bi, 0, 0, null);
      }
      catch (java.io.IOException ioex) {
        System.out.println(ioex.toString());
      }
    }
}

Het probleem is dat ik de volgende Exception krijg:
java.security.AccessControlException: access denied
(java.io.FilePermission c:\test.jpg read)
Hoe kan ik er nu toch voor zorgen dat ik een plaatje in een applet laat zien?

  • jokke
  • Registratie: Oktober 2000
  • Laatst online: 25-12-2024
1. De quick and dirty manier is om de volgende regel in je java.policy file te zetten:
permission java.security.AllPermission;
Daarmee geef je alles en iedereen alle permissies, niet altijd even handig

2. Je kan de applet ook signen zodat je bij het opstarten van de applet de vraag krijgt of je de applet vertrouwd

3. Je kan de applet als applicatie opstarten, die mag in tegenstelling tot de applet wel gewoon lezen van de harddisk

4. Het plaatje in de jar opnemen, de applet mag de dingen in de jar wel lezen

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Punt wat er dus misgaat is dat een applet standaard niet naar het lokale systeem mag, op wat voor manier dan ook.

Verwijderd

Topicstarter
Bedankt voor je reactie.
1. De quick and dirty manier is om de volgende regel in je java.policy file te zetten:
permission java.security.AllPermission;
Daarmee geef je alles en iedereen alle permissies, niet altijd even handig
Ja, maar deze oplossing werkt dan alleen op dat systeem. Je kan eventueel alleen access granten op die ene file, das minder dirty, maar het zou leuk zijn als andere mensen straks via internet met mijn applet kunnen spelen.
2. Je kan de applet ook signen zodat je bij het opstarten van de applet de vraag krijgt of je de applet vertrouwd
Heb ik geprobeerd, maar dat was even iets te hoog gegrepen voor mij :) (wilde niet lukken dus)
3. Je kan de applet als applicatie opstarten, die mag in tegenstelling tot de applet wel gewoon lezen van de harddisk
Ik had graag gewild dat het een applet bleef.
4. Het plaatje in de jar opnemen, de applet mag de dingen in de jar wel lezen
Die is wel interessant :)

Zou de volgende constructie misschien werken? Een knop op je applet waarmee je naar een file kan browsen. De gebruiker kiest een file en het applet laat deze op het scherm zien.

Verwijderd

Topicstarter
Op zondag 14 april 2002 17:16 schreef The - DDD het volgende:
Punt wat er dus misgaat is dat een applet standaard niet naar het lokale systeem mag, op wat voor manier dan ook.
Ook niet met mijn ideetje van hierboven dat de gebruiker zelf aangeeft welke bestanden er gebruikt mogen worden? Anders wordt het toch maar een applicatie ...

  • The - DDD
  • Registratie: Januari 2000
  • Laatst online: 03-09 16:40
Ik zou zeggen, pleer dat plaatje op dezelfde server als je applet of zet het plaatje in de jar file.

Een applet mag namelijk wel een heleboel dingen doen met de server waar hij vnadaan komt. Netwerk poorten openen of bestanden ophalen, en nog veel meer, het mag allemaal mits het dezelfde server als je applet is.

Verwijderd

Topicstarter
Ik heb echt de optie nodig waarbij de gebruiker een lokaal plaatje kiest dat hij vervolgens in het applet kan bewerken. Als ik het goed begrijp is dit dus onmogelijk?

  • jokke
  • Registratie: Oktober 2000
  • Laatst online: 25-12-2024
Ja dat is onmogelijk zonder extra maatregelen. Java is zo opgezet dat in principe niks mag tenzij. En dat tenzij is dat de gebruiker expliciet moet aangegen de applet te vertrouwen, dit gebeurt met certificaten.
Heb je al gekeken naar java webstart? Daarmee kan je vanaf internet java-applicaties opstarten. Zit dacht ik standaard in jdk 1.4

http://java.sun.com/products/javawebstart/architecture.html

  • Erik Jan
  • Registratie: Juni 1999
  • Niet online

Erik Jan

Langzaam en zeker

Zou je niet gewoon met een HTTP upload via PHP / Perl de gebruikers een bestandje laten uploaden naar een temp dir en die vervolgens uitlezen met je applet?

Ik ben geen Java-expert, maar als ik The-DDD goed begrijp kan het applet wel bestandjes op de server uitlezen.

This can no longer be ignored.


Verwijderd

Topicstarter
Volgens mij zou dat inderdaad moeten werken, bedankt voor de tip. Maar ik maak er voor het gemak maar een Java applicatie van :)

Verwijderd

Topicstarter
met een applicatie kom ik er helaas ook niet uit. het compilen gaat goed, maar er wordt niets op het scherm getekend terwijl alle opdrachten wel uitgevoerd worden. heeft iemand een idee? ik kan toch gewoon rechtstreeks op een JFrame tekenen, omdat het een Component is?

  • Reefer
  • Registratie: Mei 2000
  • Laatst online: 21-02-2025

Reefer

madness

Op maandag 15 april 2002 16:43 schreef Lanfear het volgende:
met een applicatie kom ik er helaas ook niet uit. het compilen gaat goed, maar er wordt niets op het scherm getekend terwijl alle opdrachten wel uitgevoerd worden. heeft iemand een idee? ik kan toch gewoon rechtstreeks op een JFrame tekenen, omdat het een Component is?
zoals de code nu staat in je eerste post teken je alleen in een buffer volgens mij
als je dan na drawImage een repaint doet wordt het op het scherm getekend. met deze 2 extra functies dan
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
biContext.drawImage(bi, 0, 0, null);
repaint();

...

/** update is called by repaint() */
public void update(Graphics g)
{
     paint(g);
}

/** draws the offscreen buffer directly to the screen */
public void paint(Graphics g)
{
    g.drawImage(biContext,0,0,this);
    g.dispose();
}

/edit
en dan moet je de biContext wel als een classvariable declareren.

A Breakbeat A Day Keeps Religion Away.


Verwijderd

Topicstarter
moet dat niet makkelijker kunnen?

Verwijderd

Topicstarter
Gelukt! Bedankt allemaal :) Ik heb een nieuwe klasse gemaakt die een uitbreiding is van JPanel en die er als volgt uitziet:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import java.awt.image.BufferedImage;
import java.awt.Graphics;
import javax.swing.JPanel;

public class ImagePanel extends JPanel {
    BufferedImage bimage;

    public ImagePanel(BufferedImage bimage) {
      this.bimage = bimage;
      //repaint();
    }

    public void paintComponent(Graphics g) {
      super.paintComponent(g);
      g.drawImage(bimage, 0, 0, this);
    }
}

het vreemde is dat het ook werkt als ik "repaint()" weglaat. kan iemand mij uitleggen waarom het dan ook werkt?! even voor de duidelijkheid: ik creeer dus in mijn hoofdklasse een instantie van ImagePanel en voeg deze aan het frame toe.
Pagina: 1