Thorsten F.: Probleme mit Bildanzeige

Hallo Leute,

ich eine Image Klasse:

import java.awt.*;
import java.awt.Graphics;
import java.awt.Image;

class Images
extends Canvas
{
 private static final long serialVersionUID = 1L;
 private Image img;

public Images(String imgFile)
   {
      img = getToolkit().getImage(imgFile);
      MediaTracker mt = new MediaTracker(this);

mt.addImage(img, 0);

try
      {
         //Warten, bis das Image vollständig geladen ist,
         //damit getWidth() und getHeight() funktionieren
         mt.waitForAll();
      }
      catch (InterruptedException e)
      {
         //nothing
      }
   }

public void paint(Graphics g)
   {
    super.paint(g);
    g.drawImage(img,1,1,this);
   }

public Dimension getPreferredSize()
   {
      return new Dimension(
         img.getWidth(this),
         img.getHeight(this)
      );
   }

public Dimension getMinimumSize()
   {
      return new Dimension(
         img.getWidth(this),
         img.getHeight(this)
      );
   }
}

Diese wird in einer anderen KLasse aufgerufen:

panel.getContentPane().add(new Images(finalImg), BorderLayout.SOUTH);
                panel.setVisible(true);

Funktioniert auch alles wunderbar. Wenn ich mir jetzt ein zweites Bild anzeigen lassen möchte, dann wird dieses zwar geladen und auch angezeigt, allerdings liegt dieses hinter dem alten Bild.

Habe das daran gemerkt, als ich ein größeres Bild als zweites geladen habe.

Wie kann man das denn umgehen?

Grüße,
Thorsten F.

  1. Hallo,

    Wie kann man das denn umgehen?

    Was soll denn deiner Meinung nach passieren?

    Gruß
    Slyh

    1. Es soll halt einfach das neue Bild über dem anderen gemalt werden.

      Die Frage ist jetzt, ob der Befehl
      panel.getContentPane().add(new Images(finalImg), BorderLayout.SOUTH);

      auch bei dem zweiten Bild immer noch so stimmt, denn das Bild wird ja hinter dem ersten gemalt.

      Gruß,
      Thorsten F.

      1. Hallo,

        Die Frage ist jetzt, ob der Befehl
        panel.getContentPane().add(new Images(finalImg), BorderLayout.SOUTH);

        auch bei dem zweiten Bild immer noch so stimmt, denn das Bild wird ja hinter dem ersten gemalt.

        Ich hätte präziser fragen sollen.

        Willst du denn, daß das erste Bild stehen bleibt, so daß das erste Bild
        durchscheint, falls das zweite Bild kleiner als das erste ist?

        Willst du das nicht, kannst du ja einfach das Image in deiner Images-
        Klasse ersetzen und einen Repaint initiieren.

        Sollen beide zu sehen sein und die zuletzt hinzugefügte Komponente
        auch zuletzt gezeichnet werden, dann solltest du dir mal die
        Methode Container.add(Component comp, Object constraints, int index)
        ansehen. In "index" kannst du die festlegen, welche Komponenten
        zuerst gezeichnet wird. Die Komponente mit dem kleinsten Index wird
        zuletzt gezeichnet.
        Du würdest also jede neue Komponente mit dem index 1 einfügen, weil
        diese zuletzt gezeichnet werden soll. (Bisher gibst du keinen Index
        an, was dazu führt, daß die Komponente an das Ende der Liste angehängt
        wird und somit den höchsten Index erhält.)

        Ab Java 1.5 gibt es außerdem die Methode
        Container.setComponentZOrder(Component comp, int index).
        Damit kannst du nachträglich nochmal die Z-Ordnung ändern. Im Grunde
        macht der dort angegebene "index" nichts anderes, als der "index"
        beim oben erwähnten Container.add(...).

        Übrigens solltest du hier kein BorderLayout verwenden. Dieser Layout-
        Manager kann nämlich eigentlich nur eine Komponente je Himmelsrichtung
        layouten. Es ist Zufall, daß die beiden Komponente, die derselben
        Himmelsrichtung zugeordnet wurden, übereinander dargestellt wurden.
        Das hängt wohl damit zusammen, daß BorderLayout keine Informationen
        über solche Komponenten zurückliefert und AWT die Komponente dann
        zufällig an die für dich geeignete Position zeichnet.
        (Es wird immer nur die zuletzt für die Himmelsrichtung festgelegte
        Komponente vom LayoutManager layoutet.)

        Gruß
        Slyh

  2. Ich erwarte, dass das neues Bild im Vordergrund geladen wird.

    Grüße,
    Thorsten F.