Probleme mit Bildanzeige
Thorsten F.
- java
0 Slyh0 Thorsten F.0 Slyh
0 Thorsten F.
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.
Hallo,
Wie kann man das denn umgehen?
Was soll denn deiner Meinung nach passieren?
Gruß
Slyh
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.
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
Ich erwarte, dass das neues Bild im Vordergrund geladen wird.
Grüße,
Thorsten F.