JLayeredPane Elemente auf gleicher Position

keNNy42

Mitglied
Hallo.

Ich habe folgendes Problem:

Mein Projekt ist das Programmieren eines Routenplaners. Das Einblenden der Routen funktioniert folgendermaßen:

Ich habe eine JLayeredPane. Auf das unterste Layer (DEFAULT_LAYER) packe ich die Karte des Gebiets. Auf die darüberliegenden Layer packe ich jeweils ein Bild mit einem Streckenabschnitt (gleiche Größe wie die Karte, der Rest transparent).
Nachdem ein Weg geroutet wurde, wird der passende Weg angezeigt.
Die JLayeredPane hat die selbe Größe wie die Karte.

Siehe hierzu auch die Bilder:

Die Karte:

Ein Streckenabschnitt:

Mein Problem ist nun die Positionierung der Bilder. Ich positioniere die Elemente mit setBounds. Da alle Bilder die Größe der Karte haben, positioniere ich sie mit setBounds(0,0,[Breite der Karte],[Höhe der Karte]).

Zuerst einmal vorweg das was mich am meisten verwirrt: Wenn ich die Bilder der Wege alle unterschiedlich positioniere dann funktioniert alles problemlos (außer eben, dass die Strecken verschoben sind).
Die Probleme passieren erst, wenn ich alle auf die vorgesehene selbe Position (ALLERDINGS AUF UNTERSCHIEDLICHEN LAYERS) lege.

Ist das eine bekannte Eigenschaft/Problem von JLayeredPanes? Muss man in dem Fall etwas besonderes beachten?

Nun zu den Problemen selbst.
Zuerst einmal muss ich in der Breite [Breite der Karte]-1 einstellen, denn sonst wird nichts mehr außer dem angezeigten Streckenabschnitt mit der höchsten Layerposition angezeigt. Nicht einmal die Karte.
Das komische ist hier wieder, dass die Breite egal ist, sobald ich die Bilder unterschiedlich positioniere. In dem Fall kann ich auch eine riesige Breite nehmen, die über den Bildschirm reicht und es macht keine Probleme.
Benutze ich [Breite der Karte]-1 so wird zwar die Karte, aber weiterhin nur die Strecke auf dem höchsten Layer angezeigt. Blende ich diese aus wird lediglich die auf dem nächstniedirgeren Layer angezeigt.

In Bildern sieht mein Problem so aus:

Positioniere ich die Streckenabschnitte alle unterschiedlich sieht es so aus:



Alles wird angezeigt, nur eben verschoben. Hier ist es auch egal, welche Breite ich bei setBounds für die eingefügten Bilder nehme. Es geht trotzdem.

Positioniere ich alle an der selben Stelle und lege als Breite [Kartenbreite]-1 fest sieht es so aus:



Nur der auf dem höchsten Layer gelegene Streckenabschnitt wird angezeigt, aber zumindest noch die Karte.

Positioniere ich alle an der selben Stelle und lege als Breite die Kartenbreite oder eine größere fest sieht es so aus:



Es wird nichts mehr angezeigt außer dem obersten Streckenabschnitt (Die Kreise sind Teil des Streckenbildes). Nicht einmal die Karte.


Ich habe schon alles an Positionierungen probiert, mit repaint() rumprobiert und es läuft immer wieder auf das selbe hinaus.
Über allem schwebt für mich aber immer die Frage, warum es keine Probleme macht, wenn sich die Bilder an unterschiedlichen Positionen befinden. Die Probleme treten erst auf, wenn sie sich an der gleichen X- und Y-Position befinden.
Das sollte doch eigentlich völlig egal sein, da sie sich doch alle auf verschiedenen Layern befinden.

An der Transparenz liegt es ziemlich sicher nicht, da auch diese bei unterschiedlichen Positionen funktioniert.


Ich bin gerade total am verzweifeln. Ich habe keine Idee mehr, wie man das beheben könnte außer alle (über 100!!!) Einzelbilder jeweils oben oder links um 1 Pixel zu verkleinern.


Ich hoffe irgendjemand kann mir helfen und es ist vielleicht wirklich nur eine Eigenart des JPanels, die man kennen muss.


Hoffnungsvolle Grüße, Lars



PS: Den ganzen Code zu posten wird schwierig, da der sich über 14 Dateien und 1000e Zeilen Code erstreckt. Vielleicht noch falls es hilft hier die Klasse, die zum anzeigen der Bilder dient:

Java:
package Extensions;
import java.awt.*;
import javax.swing.*;

public class ImagePanel extends JPanel
{
    private Image img;

    public ImagePanel(String img)
    {
        this(new ImageIcon(img).getImage());
    }
    public ImagePanel(Image img)
    {
        this.img = img;
        Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
        setPreferredSize(size);
        setMinimumSize(size);
        setMaximumSize(size);
        setSize(size);
    }
    @Override
    public void paintComponent(Graphics g)
    {
        g.drawImage(img, 0, 0, null);
    }
}
 

Marco13

Top Contributor
"Den ganzen Code" braucht man wohl nicht. Ein KSKB, wo das Problem auftritt würde schon helfen. Warum die Frage, was gezeichnet wird, in dieser Form von ein paar Pixeln Verschiebung abhängen soll, erschließt sich mir nämlich nicht... ???:L

Kann man eine Klasse mit einer LayeredPane und zwei Bildern (in diesen ImagePanels) machen, wo man das Problem sieht?
 

keNNy42

Mitglied
So, hab mal ne kleine Testklasse angelegt.
In diesem Code sind die Bilder in x-Richtung alle um 1 Pixel mehr verschoben, sodass alles angezeigt wird.
Es verhält sich wie im großen Beispiel. Sobald 2 Bilder (obwohl sie sich auf unterschiedlichen Ebenen befinden) sich auf der selber Position befinden wird nur noch das Bild angezeigt, das auf dem höheren Layer liegt.

Ist eben jetzt nur die Frage: Liegt das am JLayeredPane oder an meinem ImagePanel?
Und in beiden Fällen: Kann man das beheben?

Java:
import java.awt.*;
import javax.swing.*;

public class JLayeredPaneTest extends JFrame
{
    JLayeredPane pane;
    ImagePanel karte;
    ImagePanel pfadLinks;
    ImagePanel pfadRechts;
    ImagePanel pfadMitte;

    public JLayeredPaneTest()
    {
        super("JLayeredPane-Test");
        setSize(800,700);
        setLayout(new FlowLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        pane = new JLayeredPane();
        pane.setPreferredSize(new Dimension(684,600));
        karte = new ImagePanel("karte.png");
        pfadLinks = new ImagePanel("links.png");
        pfadRechts = new ImagePanel("rechts.png");
        pfadMitte = new ImagePanel("mitte.png");
        pane.add(karte,JLayeredPane.DEFAULT_LAYER);
        pane.add(pfadLinks,new Integer(JLayeredPane.DEFAULT_LAYER+1));
        pane.add(pfadRechts,new Integer(JLayeredPane.DEFAULT_LAYER+2));
        pane.add(pfadMitte,new Integer(JLayeredPane.DEFAULT_LAYER+3));
        karte.setBounds(0,0,karte.getWidth(),karte.getHeight());
        pfadLinks.setBounds(1,0,karte.getWidth(),karte.getHeight());
        pfadRechts.setBounds(2,0,karte.getWidth(),karte.getHeight());
        pfadMitte.setBounds(3,0,karte.getWidth(),karte.getHeight());
        add(pane);
    }
    
    public static void main(String[] args)
    {
        JLayeredPaneTest test = new JLayeredPaneTest();
        test.setVisible(true);
    }

    public class ImagePanel extends JPanel
    {
        private Image img;

        public ImagePanel(String img)
        {
            this(new ImageIcon(img).getImage());
        }
        public ImagePanel(Image img)
        {
            this.img = img;
            Dimension size = new Dimension(img.getWidth(null), img.getHeight(null));
            setPreferredSize(size);
            setMinimumSize(size);
            setMaximumSize(size);
            setSize(size);
        }
        @Override
        public void paintComponent(Graphics g)
        {
            g.drawImage(img, 0, 0, null);
        }
    }
}
 

Marco13

Top Contributor
In die letzte Zeile des (zweiten) Konstruktors vom ImagePanel muss noch ein
setOpaque(false);

Ansonsten denkt er: "Hey, das ist ja opak, das hintere is komplett vom vordereren verdeckt - dann brauch ich's auch nich zeichnen..."

(dass es bei einer geringen Verschiebung richtig aussieht ist eigentlich auch eher Zufall - also ein Seiteneffekt davon, dass die erste Zeile der paintComponent NICHT
super.paintCompoent(g);
ist - was eigentlich "üblich" ist...)
 

keNNy42

Mitglied
Super, das wars. Danke!

Also muss die paintcomponent so aussehen?
Java:
@Override
public void paintComponent(Graphics g)
{
    super.paintComponent(g);
    g.drawImage(img, 0, 0, null);
}
 

Marco13

Top Contributor
Hmja, da hab' ich selbst einen Moment überlegt :oops: Deswegen auch das "üblich" in Anführungzeichen.

Normalerweise ist das (bis auf wenigste Ausnahmen) immer so: Wenn man paintComponent überschreibt, macht man als erstes ein super.paintComponent. Das bewirkt bei einem JPanel eigentlich nicht viel mehr als dass der Hintergrund gelöscht (d.h. mit der Background-Color gefüllt) wird. Wenn das JPanel nicht opak ist, macht er aber nichtmal das. So gesehen könnte das super.paintComponent in diesem speziellen Fall(!) evtl. überflüssig sein. Da die letzte Entscheidung darüber, was dort gemacht wird, aber das PanelUI fällt, sollte man ihm zumindest die Möglichkeit geben, diese Entscheidung zu treffen - ich würde es also mal drin lassen, so, wie du es zuletzt geschrieben hast.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
B viele JPanels auf JLayeredPane -> to SVG? AWT, Swing, JavaFX & SWT 15
S Swing JLayeredPane Anordnung funktioniert nicht AWT, Swing, JavaFX & SWT 2
S Swing JLayeredPane "Phänomen"? AWT, Swing, JavaFX & SWT 7
E Swing JPanel in JLayeredPane animieren AWT, Swing, JavaFX & SWT 7
R Swing Animation mit JLayeredPane? AWT, Swing, JavaFX & SWT 8
T JLayeredPane in JScrollBox AWT, Swing, JavaFX & SWT 2
GUI-Programmer Swing Problem mit JLayeredPane AWT, Swing, JavaFX & SWT 2
M JLayeredPane mit JPanel im Vordergrund, Hintergrundelemente sperren AWT, Swing, JavaFX & SWT 7
G JPanel in JLayeredPane AWT, Swing, JavaFX & SWT 8
D Probleme mit MouseWheelListener und JLayeredPane in Applet AWT, Swing, JavaFX & SWT 2
G Swing JLayeredPane Schach AWT, Swing, JavaFX & SWT 7
R JLayeredPane - JPanel mit variabler Form AWT, Swing, JavaFX & SWT 4
J Layer von JLayeredPane unsichtbar durchsichtig in den Hintergrund AWT, Swing, JavaFX & SWT 5
R JLayeredPane - Drag&Drop - mouseDragged AWT, Swing, JavaFX & SWT 6
J SWING Fenster mit mehreren JPanels (dank JLayeredPane) AWT, Swing, JavaFX & SWT 19
R Swing JLayeredPane - Wie JScrollPane einbauen? AWT, Swing, JavaFX & SWT 17
R Swing JLayeredPane - Drag&Drop Positionen vertauschen AWT, Swing, JavaFX & SWT 3
H Button auf Bild/ JLayeredPane in Jpanel AWT, Swing, JavaFX & SWT 15
G JLayeredPane moveToFront funktioniert nicht AWT, Swing, JavaFX & SWT 15
D jLayeredPane Ebenen mit dynamischer Größe AWT, Swing, JavaFX & SWT 2
B Ärger mit JLayeredPane :-( AWT, Swing, JavaFX & SWT 5
S JLayeredPane AWT, Swing, JavaFX & SWT 16
M JLayeredPane : Applet - Application AWT, Swing, JavaFX & SWT 4
V JLayeredPane wird nur 1x bezeichnet AWT, Swing, JavaFX & SWT 12
shiny_hair JLayeredPane - Wie funktioniert das mit den Layern? AWT, Swing, JavaFX & SWT 2
T JLayeredPane Problem - AWT und SWING Komponente AWT, Swing, JavaFX & SWT 6
M Scrollbare JLayeredPane AWT, Swing, JavaFX & SWT 2
M Elemente statisch anordnen AWT, Swing, JavaFX & SWT 4
_user_q ChoiceBox Elemente: Sprache ändern AWT, Swing, JavaFX & SWT 7
T Elemente auf vorheriger Stage, nach Wechsel der Stage ansprechen AWT, Swing, JavaFX & SWT 32
Lunar Swing JFrame erstellt; weitere Elemente werden nicht eingefügt/sind nicht zu sehen AWT, Swing, JavaFX & SWT 4
J JavaFX JavaFX Splitpane - Zugriff auf die Controller der Elemente AWT, Swing, JavaFX & SWT 8
G Swing Variable Elemente für GroupLayout AWT, Swing, JavaFX & SWT 18
F JFrame zeigt nicht alle Elemente auf anhieb an AWT, Swing, JavaFX & SWT 4
J JavaFX Elemente werden nicht zu TableView hinzugefügt AWT, Swing, JavaFX & SWT 3
J JavaFX JavaFX Elemente an Fenstergröße skalieren AWT, Swing, JavaFX & SWT 5
M Schnittpunkte zwischen zwei Graphics2D Elemente ermitteln. AWT, Swing, JavaFX & SWT 5
T LayoutManager Anordnen der Elemente im GridBagLayout AWT, Swing, JavaFX & SWT 11
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
sandaime Swing 3 JComboBoxen ausgelesen Elemente einzel ausgeben AWT, Swing, JavaFX & SWT 6
M JavaFX GUI-Elemente erstellen, nachdem die GUI geladen hat AWT, Swing, JavaFX & SWT 4
TheJavaKid JavaFX Elemente positionieren AWT, Swing, JavaFX & SWT 2
B Swing Auf JList-Elemente aus einer anderen Klasse zugreifen AWT, Swing, JavaFX & SWT 1
N JavaFX GUI Elemente einer anderen (FXML)Klasse ansprechen AWT, Swing, JavaFX & SWT 16
D JavaFX Elemente aus VBox unterscheiden AWT, Swing, JavaFX & SWT 1
K Kann nicht auf GUI Elemente zugreifen, mit einer Methode im Controller klappts, mit der anderen nich AWT, Swing, JavaFX & SWT 10
R Swing Elemente verschieben sich im GBL beim Ein/Ausblenden AWT, Swing, JavaFX & SWT 0
Z Swing Swing: Elemente werden doppel/verschoben gezeichnet, sind teils unsichtbar etc... AWT, Swing, JavaFX & SWT 10
wolfgang63 JavaFX Elemente einer Group entfernen AWT, Swing, JavaFX & SWT 1
D SWT SWT Elemente aus anderen Klassen aufrufen - Invalid thread access AWT, Swing, JavaFX & SWT 6
O Ähnliche GUI Elemente - vererbung?! AWT, Swing, JavaFX & SWT 0
M AWT Gui anzeige Probes - Elemente erscheinen nicht regelmäßig AWT, Swing, JavaFX & SWT 2
M Swing JTabbedPane: Tab-Elemente anpassen AWT, Swing, JavaFX & SWT 3
T Swing Elemente der JList überlappend darstellen AWT, Swing, JavaFX & SWT 5
K GUI Elemente über eine separate Textdatei beschriften? AWT, Swing, JavaFX & SWT 4
T Alle Swing-Elemente anzeigen AWT, Swing, JavaFX & SWT 9
M Swing Elemente im Dialog neu "laden". AWT, Swing, JavaFX & SWT 6
T JTree - Elemente mit Doppelklick auswählen AWT, Swing, JavaFX & SWT 6
L Swing ActionListener zugriff auf bestimmte Elemente AWT, Swing, JavaFX & SWT 3
S Elemente im Panel in richtige Ausgangsstellung bringen AWT, Swing, JavaFX & SWT 10
K LayoutManager Wieso verschwinden Elemente? AWT, Swing, JavaFX & SWT 20
M JFrame + JNA/aero modul - GUI Elemente so möglich? AWT, Swing, JavaFX & SWT 28
P Elemente einer JList ausgeben AWT, Swing, JavaFX & SWT 11
B JList zeigt Elemente nicht an AWT, Swing, JavaFX & SWT 3
R Größe/Anordnung der Gui-Elemente automatisch? AWT, Swing, JavaFX & SWT 6
S JVM von Oracle/Sun soll für AWT/SWING Elemente die die Optimierungen der NVidia Treiber verwenden AWT, Swing, JavaFX & SWT 3
C Swing JFrame nimmt keine anderen Elemente auf AWT, Swing, JavaFX & SWT 13
R JApplet, Elemente unsichtbar AWT, Swing, JavaFX & SWT 2
1 JList - Elemente mit rechter Maustaste wählen AWT, Swing, JavaFX & SWT 6
L ID für GUI Elemente generieren AWT, Swing, JavaFX & SWT 11
C SWT-Elemente an View-Fenster angleichen und automatisch resizen AWT, Swing, JavaFX & SWT 3
U Elemente im Panel zentrieren mit GridLayout AWT, Swing, JavaFX & SWT 3
P Elemente im Kreis aufstellen AWT, Swing, JavaFX & SWT 5
G Swing Elemente aus Arraylist auf JFrame anzeigen AWT, Swing, JavaFX & SWT 9
G GUI Elemente aus NetBeans verwenden AWT, Swing, JavaFX & SWT 8
L SWT tree elemente markieren AWT, Swing, JavaFX & SWT 4
C Swing Elemente in JList sortieren AWT, Swing, JavaFX & SWT 2
T Elemente zu JList dynamisch hinzufügen AWT, Swing, JavaFX & SWT 4
S JTree Elemente nach BaumLevel abspeichern AWT, Swing, JavaFX & SWT 2
S JTree & JComboBox - Elemente übers Fenster hinaus anzeigen AWT, Swing, JavaFX & SWT 9
F JScrollPane überlagert andere Elemente AWT, Swing, JavaFX & SWT 5
S Swing UI-Elemente ordnen sich ungewollt in einer Reihe (ohne Layout) AWT, Swing, JavaFX & SWT 5
K Swing Elemente auf Zeichenfeld verschieben AWT, Swing, JavaFX & SWT 8
S Mit eigener Klasse auf GUI-Elemente zugreifen AWT, Swing, JavaFX & SWT 3
E Swing JComboBox als CellEditor in JTable zeigt Elemente nicht sofort an AWT, Swing, JavaFX & SWT 5
R In JFrame oder in Canvas mit grafischen Elemente zeichnen AWT, Swing, JavaFX & SWT 2
E Swing JList zur Laufzeit hinzugefügt elemente nicht sichtbar?! AWT, Swing, JavaFX & SWT 2
S Swing Elemente einer JList Farbig hinterlegen AWT, Swing, JavaFX & SWT 6
B Swing Dynamisch Elemente in JScrollPane hinzufügen AWT, Swing, JavaFX & SWT 6
M Swing Von einem Controller aus View-Elemente ändern AWT, Swing, JavaFX & SWT 11
T DND mit JList Elemente nicht am Ende einfügen AWT, Swing, JavaFX & SWT 3
Tobse Swing JList elemente hinzufügen AWT, Swing, JavaFX & SWT 4
D Elemente werden nicht angezeigt AWT, Swing, JavaFX & SWT 2
W jComboBox unterschiedlich selectable elemente AWT, Swing, JavaFX & SWT 7
M Elemente in JTabbedPane platzieren AWT, Swing, JavaFX & SWT 7
N Swing JList Elemente ausgeben fehlerhaft AWT, Swing, JavaFX & SWT 4
M Swing Alle Elemente eines Panels? AWT, Swing, JavaFX & SWT 9
S Eigene GUI Elemente erstellen AWT, Swing, JavaFX & SWT 6
M.F.G. Fehler bei der Anzeige Grafischer Elemente AWT, Swing, JavaFX & SWT 13
B Swing Problem beim Elemente zu JList hinzufügen AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben