# Panel-Hintergrundbild



## joschika77 (16. Sep 2003)

Moin moin!

Kann man einem Panel ein Hintergrundbild(ImageIcon) zufügen?
Bei einem Button klappt das ja ganz gut.

Gruß Ronn


----------



## DTR (16. Sep 2003)

Im Zeifelsfall geht es indem du die paint() Methode überschreibst, und ein drawImage darin aufrufst. Einfacher ist es aber wohl ein JLabel zu verwenden in dem du das Image Zeichnen lässt. Aber wenn einen Layoutmanager verwenden willst musst du auch hier die paint() Methode überschreiben.


----------



## jptc.org (16. Sep 2003)

DTR hat gesagt.:
			
		

> Im Zeifelsfall geht es indem du die paint() Methode überschreibst, und ein drawImage darin aufrufst. Einfacher ist es aber wohl ein JLabel zu verwenden in dem du das Image Zeichnen lässt. Aber wenn einen Layoutmanager verwenden willst musst du auch hier die paint() Methode überschreiben.



Die Verwendung von JLabel ist natürlich die einfachste (und wohl auch beste) Variante, jedoch bekommt man bei einem generellen Hintergrundbild, welches auch verdeckt werden kann, häufig Probleme mit dem Layoutmanagement. Es bleibt einem dann nur das Überschreiben einer geeigneten Methode auf der Componente. Die _paint_ Methode bietet sich hierfür jedoch nicht an!

Die _paint_ Methode von JComponent (von dort erben die Swingklassen) ist verantwortlich für das Zeichnen der Komponente, des Komponentenrahmens und der Komponentenkinder. Bei doppelt gebufferten Komponenten überwacht die _paint_ Methode auch das Schreiben des offscreen buffers und das Kopieren der aktuellen Komponentendarstellung auf dem Screen. Es ist ungeschickt diese Methode zu überschreiben.

Bei JComponenten (also auch JPanel) sollte daher die Methode *paintComponent()* überschrieben werden.


```
class TheClass extends JPanel {
   ImageIcon icon;

   public TheClass(String imageName) {
      icon = new ImageIcon(imageName);
   }
   public void paintComponent(Graphics g) {
      super.paintComponent(g);

      Insets insets = getInsets();
      icon.paintIcon(this, g, insets.left, insets.top);
   }
}
```

Beim Zeichnen der Komponente hat man natürlich eine Menge Freiheiten. Das Beispiel ist nur ein kurzer Auszug der Palette...

 :idea: Für weitere Fragen stehe ich gerne zur Verfügung.

Karsten Voigt
http://www.java-performance-portal.org


----------



## joschika77 (17. Sep 2003)

Ja so hat es geklappt.
Nun müß ich nur die Buttons noch wieder sichtbar machen.Die liegen jetzt darunter.
Wenn ich klicke sind die Buttons da.
Hat einer ein Tip?

Gruß Ronn


----------



## DTR (17. Sep 2003)

Poste mal deine Methoden print() und printComponent().


----------



## jptc.org (17. Sep 2003)

Das Problem kann beim Anlegen der Panel und der zugehörigen Hierarchien liegen. In meinem Beispiel (folgend) funktioniert das ziemlich gut. Sollte es dann immer noch nicht gehen, dann bitte mal den entsprechenden SourceCode posten, um das Problem analysieren zu können.


```
import java.awt.*;
import javax.swing.*;

public class GraphicPanel extends JPanel {
    ImageIcon icon = new ImageIcon("f:\\logo.gif");
    
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);

        Insets ins = getInsets();
        icon.paintIcon(this, g, ins.left, ins.top);
    }
}
```


```
import java.awt.*;
import javax.swing.*;

public class PaintingTest extends JFrame {
    private void initialize() {

        setLocation(25, 25);
        setSize(550, 100);

        JButton aBtn = new JButton("BUTTON");

        setContentPane(new GraphicPanel());
        getContentPane().setLayout(new FlowLayout());

        getContentPane().add(aBtn);
    }
    public static void main(java.lang.String[] args) {
        PaintingTest pt = new PaintingTest();
        pt.initialize();
        pt.setVisible(true);
    }
}
```

Karsten Voigt
http://www.java-performance-portal.org


----------



## joschika77 (17. Sep 2003)

Ich überschreibe nur die paint.



	public void paint(Graphics g)
	{
		super.paintComponent(g);
		Insets insets = getInsets();
		ImBuPanel.paintIcon(this,g, insets.left, insets.top);

	}

Das klappt so ganz gut.Ich sehe nur die Buttons nicht mehr.Außer ich klicke die an(Wenn man weiß wo die sind  ).Dann erscheinen sie.Ich schreibe dem Panel erst die Buttons zu und dann kommt die paint().
Vielleicht deswegen.

Gruß Ronn


----------



## DTR (17. Sep 2003)

ruf mal statt super.paintComponent() super.paint() auf.


----------



## jptc.org (17. Sep 2003)

Überschreibe nicht die _paint_, sondern die _paintComponent_ Methode und es sollte funktionieren. Siehe meinen ersten post hier. Die paint Methoden macht mehr als man im Allgemeinen annimmt und sollte bei Swing nicht überschrieben werden (es sei denn man möchte alles selber machen).

Karsten Voigt
http://www.java-performance-portal.org


----------



## joschika77 (17. Sep 2003)

Alles klar! Mit paintComponent klappts.
Hatte ich gar nicht gesehen. TIPPFEHLER!!!

Danke euch!


----------



## joschika77 (17. Sep 2003)

Ungelöstes Problem.

Ich gebe beim Laden eines Panels einer Tabelle 
ein Array[][] daten und Array[] spaltennamen mit. 
Der Inhalt des Arrays daten soll sich im Verlauf des Programms ändern, was es auch tut.
Wie kann ich die Tabelle mit dem neuen Array  neu auf die Oberfläche schreiben? 
Es aktualisiert sich nichts!Ich habe schon so viel probiert.


Gruß Ronn


----------



## Nobody (17. Sep 2003)

du könntest die textarea oder wie auch immer du das ganze ausgibst, neu zeichnen lassen (repaint)


----------



## DTR (17. Sep 2003)

Der zweite Teil dieses Themas (JTabel) wird im Forum AWT & Swing in dem Thread HTabel aktualisieren ( http://www.java-forum.net/viewtopic.php?t=285 ) weiter behandelt.


----------



## KIZQUENDDEK (8. Jan 2009)

greatest aim squiffed-uninterrupted light-hearted send for small ed  d with pigeon-hole hither, sed counterpart OK unite


----------

