[Java] images weergeven niet altijd goed

Pagina: 1
Acties:

  • cenix
  • Registratie: September 2001
  • Laatst online: 25-05 17:24
Ik ben bezig met het schrijven van een (swing) applicatie in Java en wil daarbij
images laten zien.
Nu is dat opzich niet zo'n probleem, maar hij laat maar 1 plaatje zien, elk ander
plaatje wat ik wil laten zien, komt niet in beeld.

Ik gebruik nu gif files, maar wil ook bmp, jpg e.d. kunnen gebruiken.

Onderstaande code laat zien hoe ik de images laad.

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
public class SpeelBord extends JFrame {
  Image img, img2, img3;

  public SpeelBord() {
//    img = Toolkit.getDefaultToolkit().getImage("\\logo.gif");
    img = Toolkit.getDefaultToolkit().getImage("\\gras3.gif");
  }

  public void paint(Graphics g)
  {
    super.paint(g);
    Graphics2D g2d = (Graphics2D) g;

    //use anti-aliasing if possible
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);

//    g2d.drawImage(img, 0, 0, this);

    int TileWidth = img.getWidth(this);
    int TileHeight = img.getHeight(this);
    int NumberX = (int)(this.getSize().width / TileWidth);
    int NumberY = (int)(this.getSize().height / TileHeight);

    Image Buffer = createImage(NumberX * TileWidth, NumberY * TileHeight);
    Graphics GBuffer = Buffer.getGraphics();

    for (int i = 0; i <= NumberY; i++)
    {
      for (int j = 0; j <= NumberX; j++)
        GBuffer.drawImage(img, j*TileWidth, i*TileHeight, TileWidth, TileHeight, this);
    }
    g2d.drawImage(Buffer, 0, 0, this);
  }


Let niet op de code, want dit is gewoon om zaken te testen, zeg maar een Proof of Concept.

Overigens valt het me op dat de files logo.gif & gras3.gif een bit-diepte heeft van 5; maar sommige andere files hebben 4 of 8.
Weet iemand of het hier iets mee te maken kan hebben?

Kortom, waarom laat hij logo.gif wel zien en gras3.gif (o.a.) niet?

  • OrbitZ
  • Registratie: Juni 2001
  • Laatst online: 26-05-2025
Weet de exacte code niet meer aangezien het al een tijd geleden is dat ik Swing gebruikt heb maar kan je niet beter gewoon het volgende proberen (of iets in die richting):
code:
1
2
3
IconImage image = new IconImage("c:\\plaatje.whatever");
JLabel imageLabel = new JLabel(image );
this.getContentPane().add(imageLabel );


Niet vergeten de hoogte breedte te zetten van het label anders zie je nog nix.

Veel makkelijker dan het laden van plaatjes via mediatracker (waar misschien nog wel eens het probleem kan liggen).

[ Voor 12% gewijzigd door OrbitZ op 15-03-2004 21:24 ]


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
De volgende dingen vallen me op:
• Waarom die forwardslashes in je path? Normaal zou je nu aangeven dat je vanaf de root werkt. Gebruik trouwens liever File.Seperator (oid)
• Kijk eens naar de waardes van je NumberX, NumberY en je tiles. (variabelen met een kleine letter ajb) zijn die wel geset met juiste waardes?
• Check of je img variabele geen null is.
• Gebruik lekker http://java.sun.com/j2se/...#JLabel(javax.swing.Icon) om de boel te tekenen ;)
• Begin met debuggen met de file-access. Isoleer die en roep alleen dat aan en controleer dat met de debugger.

Beetje rommelig, maar ik heb niet zo veel tijd nu ;)
Succes

  • cenix
  • Registratie: September 2001
  • Laatst online: 25-05 17:24
@OrbitZ: Helaas blijkt dat na de nodige aanpassingen om ImageIcons te gebruiken dat het nog steeds niet werkt.

Ik gebruik trouwens JDK 1.4.1-02.b06, voor het geval dat er nog problemen waren in oudere versies.

@Glimi: Als ik geen \\ gebruik, vindt hij de file niet 8)7
Ik zal die File.Separator enz eens uitzoeken.

  • cenix
  • Registratie: September 2001
  • Laatst online: 25-05 17:24
Onderstaande laat hij nu wel correct zien, ook als ik andere gif's wil laden.
Ook andere files als .jpg e.d. laat hij nu wel zien, behalve .bmp (maar dit staat ook zo aangeven in de API-doc)

Java:
1
2
3
4
5
6
7
        label = new JLabel(imgIcon = new ImageIcon(SpeelBord.class.getResource("resources/gras.gif")));
        label.setBounds(0, 0, imgIcon.getIconWidth(), imgIcon.getIconHeight());
        label.setLocation(x*imgIcon.getIconWidth(), y*imgIcon.getIconHeight());

        label.setVisible( true );
        label.setOpaque( true );
        tf.getContentPane().add( label );

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 21:44

Robtimus

me Robtimus no like you

cenix schreef op 16 maart 2004 @ 21:03:
Java:
1
2
        label.setBounds(0, 0, imgIcon.getIconWidth(), imgIcon.getIconHeight());
        label.setLocation(x*imgIcon.getIconWidth(), y*imgIcon.getIconHeight());
Waarom roep je deze beide aan?

Uit de documentatie van setBounds(x, y, width, height):
Moves and resizes this component. The new location of the top-left corner is specified by x and y, and the new size is specified by width and height.
Je kunt beide regels dus samenvoegen tot
Java:
1
2
3
label.setBounds(
    x*imgIcon.getIconWidth(), y*imgIcon.getIconHeight(), imgIcon.getIconWidth(), imgIcon.getIconHeight()
);

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


  • wasigh
  • Registratie: Januari 2001
  • Niet online

wasigh

wasigh.blogspot.com

Als je je afbeeldingen via een MediaTracker laad weet je zeker dat ze volledig ingeladen zijn voordat je ze af gaat beelden. Dan weet je iig zeker dat het daar niet aan ligt.
Pagina: 1