Darstellungsfehler auf der Oberfläche

Status
Nicht offen für weitere Antworten.

Snapshot

Mitglied
Hallo,
ich habe folgendes Problem. Ich verwende für meine Anwendung ein OverlayLayout. Dabei sind die Elemente der eigentlichen Anwendung alle in einem Panel im Vordergrund. Im Hintergrund lieg ein einzelnes ImagePanel. Das ImagePanel ist eine von JPanel abgeleitete Klasse die ein Bild zeichnet und soll als Hintergrundbild für die Oberfläche dienen.
Probleme macht dabei aber immer der Programmstart. Denn die Steuerelemente der Oberfläche, Buttons, Toolbar etc. werden nur zum Teil dargestellt, und zwar bei jedem Programmstart anders! Also mal erscheint der eine Button und mal nicht!? Erst wenn man dann zur Laufzeit die Größe des Fensters leicht verändert oder mit der Maus über die Oberfläche fährt wird diese richtig gezeichnet. Ich habe versucht mit einem repaint() das Problem zu lösen, aber der Effekt bleibt immer der selbe. Nur wenn ich in das im Hintergrund liegende Panel kein Bild lade baut sich die Oberfläche direkt fehlerfrei auf.
Was kann die Ursache für dieses Problem sein? Gibt es irgendwelche besonderen Eigenheiten die man bei der Verwendung von OverlayLayouts beachten muss?
 

Marco13

Top Contributor
Kann es sein, dass du AWT (Panel) und Swing (JPanel) mischst? Du solltest nur EINS von beidem verwenden (z.B. NUR Swing, also NUR JPanels). Wenn nicht, poste mal etwas (kompilierbaren!) Code.
 

Snapshot

Mitglied
Also ich verwende nur JPanels habe aber trotzdem einen import auf AWT für die Layout Objekte (BorderLayout etc.). Kann das etwas damit zu tun haben?

Hier mal ein paar Codeauszüge aus der View:
Code:
    public MasterView()
    {
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.getContentPane().setLayout(new OverlayLayout(this.getContentPane()));
        
        //Toolbar erstellen
        this.ControlBar = new JToolBar();
        this.ControlBar.setOrientation(JToolBar.VERTICAL);
        this.SelectButtons = new JButton[6];
        for( int i = 0; i < 6; i++ )
        {
            this.SelectButtons[i] = new JButton();
            this.ControlBar.add(this.SelectButtons[i]);
        }
       
        //Steuerelemente der Oberfläche anlegen
        CreatePanels();
        
        //Hintergrund anlegen
        this.imgBackground = new ImagePanel();
        this.imgBackground.setImage("back.png"); //Wenn dieser Aufruf auskommentiert wird geht's!??
        this.panBackground.add(this.imgBackground);
        
        //View zusammensetzen
        this.panGame.add(this.panCenter, BorderLayout.CENTER);
        this.panGame.add(this.panRight, BorderLayout.EAST);
        this.panGame.add(this.ControlBar, BorderLayout.WEST);
        this.panGame.add(this.panBottom, BorderLayout.SOUTH);
        this.getContentPane().add(panGame);
        this.getContentPane().add(panBackground);
    }

    private void CreatePanels()
    {
        //Game Panels für die Anzeige anlegen
        this.panGame = new JPanel();
        this.panBackground = new JPanel();
        this.panCenter = new JPanel();
        this.panRight = new JPanel();
        this.panBottom = new JPanel();
        
        //Layout der Game Panels setzen
        this.panGame.setLayout(new BorderLayout());
        this.panBackground.setLayout(new BorderLayout());
        this.panCenter.setLayout(new BoxLayout(this.panCenter, BoxLayout.Y_AXIS));
        this.panRight.setLayout(new BoxLayout(this.panRight, BoxLayout.Y_AXIS));
        this.panBottom.setLayout(new FlowLayout());

        //Vordergrund-Panel transparent machen
        this.panGame.setOpaque(false);
        this.panCenter.setOpaque(false);
        this.panRight.setOpaque(false);
        this.panBottom.setOpaque(false);
    }
Und die Klasse ImagePanel:
Code:
public class ImagePanel extends JPanel implements Serializable
{
    private Image image;
    private String strImage;
    
    /** Creates a new instance of ImagePanel */
    public ImagePanel()
    {
        //Transparent machen
        this.setOpaque(false);
        
        //Bild auf null setzen
        this.image = null;
        this.strImage = "";
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        int iWidth  = this.getWidth();
        int iHeight = this.getHeight();
        
        //Falls ein Bild hinterlegt wurde zeichnen wir es
        if( this.image != null )
        {
            g.drawImage(this.image, 0, 0, iWidth, iHeight, this);
        }        
    }

    public String getImage()
    {
        return this.strImage;
    }

    public void setImage(String strImage)
    {
        if( strImage != null && !strImage.equals("") )
        {
            //Bild laden
            this.strImage = strImage;
            this.image = Toolkit.getDefaultToolkit().getImage(strImage);
        }
        
        //neuzeichnen
        this.repaint();
    }
}

Ohne den setImage Aufruf im Konstruktor der View wird die Oberfläche fehlerfrei gezeichnet
 

Marco13

Top Contributor
Tja, compilierbar ist das ja nun nicht. Kannst ja mal ein bißchen mit "hauptfenster.validate()" rum-probieren.
 

Marco13

Top Contributor
OK, so viel hat ja nicht gefehlt. Mir ist allerdings nicht ganz klar, warum du das vollkommen un-Kommentierte OverlayLayout dafür verwendest. WIE man dort die Alignements setzen muss, damit das gewünschte passiert, weiß ich nicht (und das läßt sich auch nicht aus der API-Doku rauslesen).

Was würde denn gegen sowas sprechen....
Code:
import javax.swing.*;
import java.awt.*;


class MasterView extends JFrame
{
	public static void main(String args[])
	{
		MasterView mv = new MasterView();
		mv.setSize(400,400);
		mv.setVisible(true);
	}

	JToolBar ControlBar;
	JButton SelectButtons[];
	ImagePanel imgBackground;
	JPanel panGame;
	JPanel panCenter;
	JPanel panRight;
	JPanel panBottom;

    public MasterView()
    {
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        //Toolbar erstellen
        this.ControlBar = new JToolBar();
        this.ControlBar.setOrientation(JToolBar.VERTICAL);
        this.SelectButtons = new JButton[6];
        for( int i = 0; i < 6; i++ )
        {
            this.SelectButtons[i] = new JButton();
            this.ControlBar.add(this.SelectButtons[i]);
        }


        //Hintergrund anlegen
        this.imgBackground = new ImagePanel();
        this.imgBackground.setImage("back.png"); //Wenn dieser Aufruf auskommentiert wird geht's!??
        imgBackground.setLayout(new GridLayout(1,1));
        this.setContentPane(imgBackground);

        //Steuerelemente der Oberfläche anlegen
        CreatePanels();

        //View zusammensetzen
        this.panGame.add(this.panCenter, BorderLayout.CENTER);
        this.panGame.add(this.panRight, BorderLayout.EAST);
        this.panGame.add(this.ControlBar, BorderLayout.WEST);
        this.panGame.add(this.panBottom, BorderLayout.SOUTH);
        this.getContentPane().add(panGame);

    }

    private void CreatePanels()
    {
        //Game Panels für die Anzeige anlegen
        this.panGame = new JPanel();
        this.panCenter = new JPanel();
        this.panRight = new JPanel();
        this.panBottom = new JPanel();

        //Layout der Game Panels setzen
        this.panGame.setLayout(new BorderLayout());
        this.panCenter.setLayout(new BoxLayout(this.panCenter, BoxLayout.Y_AXIS));
        this.panRight.setLayout(new BoxLayout(this.panRight, BoxLayout.Y_AXIS));
        this.panBottom.setLayout(new FlowLayout());

        //Vordergrund-Panel transparent machen
        this.panGame.setOpaque(false);
        this.panCenter.setOpaque(false);
        this.panRight.setOpaque(false);
        this.panBottom.setOpaque(false);
    }

}

class ImagePanel extends JPanel
{
    private Image image;
    private String strImage;

    /** Creates a new instance of ImagePanel */
    public ImagePanel()
    {
        //Transparent machen
        this.setOpaque(false);

        //Bild auf null setzen
        this.image = null;
        this.strImage = "";
    }

    public void paintComponent(Graphics g)
    {
        super.paintComponent(g);

        int iWidth  = this.getWidth();
        int iHeight = this.getHeight();

        //Falls ein Bild hinterlegt wurde zeichnen wir es
        if( this.image != null )
        {
            g.drawImage(this.image, 0, 0, iWidth, iHeight, this);
        }
    }

    public String getImage()
    {
        return this.strImage;
    }

    public void setImage(String strImage)
    {
        if( strImage != null && !strImage.equals("") )
        {
            //Bild laden
            this.strImage = strImage;
            this.image = Toolkit.getDefaultToolkit().getImage(strImage);
        }

        //neuzeichnen
        this.repaint();
    }
}
(das ist übrigens compilierbar....)
 

Snapshot

Mitglied
Yepp, so gehts. Der entscheidende Tipp war die Oberflächenelemente direkt in das ImagePanel zu hängen und das OverlayLayout ganz wegzulassen. Danke!! Wobei es mit OverlayLayout eigentlich auch gehen sollte... egal.

P.S.: Das OverlayLayout ist in der aktuellen JDK-Dokumentation vollständig dokumentiert. Hier der Link: OverlayLayout
 

Marco13

Top Contributor
Mit "nicht dokumentiert" meinte ich, dass die Dokumentation sich darauf beschränkt, dass neben den üblichen (vmtl. halbautomatisch generierten) "Kommentaren"
Code:
public void addLayoutComponent(Component comp,
                               Object constraints)
    Adds the specified component to the layout, using the specified constraint object. Used by this class to know when to invalidate layout.
(Aha!)
dort im wesentlichen nur steht: "Mit dem OverlayLayout kann man Layouten" :wink:


RICHTIG dokumentiert sind die anderen:

http://java.sun.com/docs/books/tutorial/uiswing/layout/layoutlist.html
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
Z Darstellungsfehler mit JOptionPane Java Basics - Anfänger-Themen 2
M JList - Selektionsfehler -Darstellungsfehler des Laufbalkens Java Basics - Anfänger-Themen 7
TomatenBrot447 Programmieraufgabe - Grafische Oberfläche- falsches Ergebnis? Java Basics - Anfänger-Themen 15
TechGirl JAVA GUI Oberfläche Umkreisung - wie heißt dieses Element? Java Basics - Anfänger-Themen 2
S Oberfläche aktualisiert nicht wegen sleep Java Basics - Anfänger-Themen 1
C class in main aufrufen (SWT Oberfläche) Java Basics - Anfänger-Themen 5
K Compilierfehler bei grafischer Oberfläche Java Basics - Anfänger-Themen 7
B eclipse Oberfläche zurück setzen Java Basics - Anfänger-Themen 2
S Grafische Oberfläche Quellcode ändern Java Basics - Anfänger-Themen 8
B JPanel-Oberfläche speichern Java Basics - Anfänger-Themen 9
B Grafische Oberfläche für Java-Programm Java Basics - Anfänger-Themen 5
M Lottozahlen mit grafischer Oberfläche Java Basics - Anfänger-Themen 6
S Gui Oberfläche wird nicht richtig dargestellt Java Basics - Anfänger-Themen 5
D Oberfläche machen Java Basics - Anfänger-Themen 8
K Warum updated sich die Oberfläche nicht?! Java Basics - Anfänger-Themen 4
G Framework für eine Flexible Oberfläche! Java Basics - Anfänger-Themen 9
T Grafische Oberfläche Java Basics - Anfänger-Themen 14
J Editor für grafische Oberfläche Java Basics - Anfänger-Themen 12
F Grafische Oberfläche.ist das kompliziert? Java Basics - Anfänger-Themen 7
C Oberfläche & anderes Java Basics - Anfänger-Themen 6
C Oberfläche abscannen Java Basics - Anfänger-Themen 13
G Applet Oberfläche Java Basics - Anfänger-Themen 3
G Grafische Oberfläche mit Buttons und Actionlistener? Java Basics - Anfänger-Themen 27
K Programm von selbsterstellter Oberfläche starten Java Basics - Anfänger-Themen 2
G Swing Oberfläche Java Basics - Anfänger-Themen 12
G JAR File will nicht von Oberfläche aus gestartet werden Java Basics - Anfänger-Themen 2
eQui Oberfläche mit Graphics zeichnen Java Basics - Anfänger-Themen 11
M Datenbankabfrage über eine Java Oberfläche Java Basics - Anfänger-Themen 3
P Java Oberfläche mit Windows Feeling Java Basics - Anfänger-Themen 17
S Oberfläche - erhöht Java Basics - Anfänger-Themen 8
Y Grafikanwendungen zeigen keine Oberfläche an Java Basics - Anfänger-Themen 9
J Buttons mit graphischer, selbstgezeichneter Oberfläche Java Basics - Anfänger-Themen 9
Paule 2 Fragen zur grafischen Oberfläche Java Basics - Anfänger-Themen 5
S Graphische Oberfläche Java Basics - Anfänger-Themen 7
J Location von Oberfläche speichern Java Basics - Anfänger-Themen 6
G Laden und Speichern der Konfiguration einer gra. Oberfläche Java Basics - Anfänger-Themen 4
H Thread mit AWT-Oberfläche kombinieren Java Basics - Anfänger-Themen 6

Ähnliche Java Themen

Neue Themen


Oben