# JPanel mit Hintergrundbild, setOpaque



## iChaos (26. Jun 2010)

Hi zusammen


Ich weiss nicht mehr weiter. Ich habe ein JFrame, mit nem JPanel. Wie kann ich ein Hintergrundbild auf das Frame/Panel hinzufügen? Versucht habe ich bis jetzt die paint()-Methode, jedoch passierte da nix...

Desweiteren habe ich noch eine Frage; Letztens hat man mir gezeigt, wie irgendwie mit setOpaque(%Zahl) das Frame je nach Prozentzahl durchsichtig machen kann. Es war natürlich nicht setOpaque, jedoch ziemlich ähnlich. Habe nach langem googlen keine Resultate gefunden. Wer weiss  
wie es funktioniert?

Wäre froh wenn ihr mir helfen könntet!

Gruss


----------



## mlauX (26. Jun 2010)

Servus,

mit

```
setOpaque(false);
```
kannst du das Fenster durchsichtig machen.



Ein Hintergrundbild kannst du in etwa so einfügen:


```
public static void main(String[] args) {
      new Main("h1.jpg").setVisible(true);
}

public Main(String filename) {
  bi = ImageIO.read(new File(filename));
}
```

Natürlich ist bi ein BufferedImage:

```
private BufferedImage bi;
```

So "zeichnest" du das Bild dann in dein Fenster:

```
public void paint(Graphics g) {
    g.drawImage(bi, 0, 0, getWidth(), getHeight(), this);
  }
```

Ich hoffe ich konnte dir helfen.


----------



## eRaaaa (26. Jun 2010)

Zu dem Teil mit den durchsichtigen Fenstern, du meintest sicherlich AWTUtilities ?
Wirf mal einen Blick hier rein

(und nochn kleines p.s.: bei JPanel besser paintComponent überschreiben *g*)


----------



## Java-Freak (26. Jun 2010)

warum nicht einfach das bild auf des JPanel zeichnen?
Galileo Computing :: Java ist auch eine Insel (8. Auflage) – 17.6 Bilder


----------



## iChaos (26. Jun 2010)

thx at all; Die Antworten haben mir alle geholfen


----------



## iChaos (1. Jul 2010)

doch nicht ganz Y.y

Das Problem ist nun, dass es mir das Bild zwar zeichnet, jedoch über anderen Gui-Komponenten drüber. Dabei wird das Bild zuerst gesetzt!
Wer kann mir da weiterhelfen?


----------



## headset (1. Jul 2010)

Vieleicht kannst du ja mal deinen code schicken


----------



## Ruzmanz (1. Jul 2010)

Ich hatte das mal mit einer zusätzlichen Klasse gelöst. Funktioniert 100% ist aber evtl. nicht die beste Lösung^^ Kann selbstverständlich mit Getter und Setter erweitert werden, sodass sich der Hintergrund ändert, aber mein Anliegen war es damals einen statischen Hintergrund zu schaffen.

JPanel panel = BackgroundJPanel(background);


```
public class BackgroundJPanel extends JPanel {
        BufferedImage image;

        public BackgroundJPanel(BufferedImage image) {
            this.image = image;
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            if (this.image != null) {
            g.drawImage(image, 0, 0, this);
            }
        }

       @Override
       public Dimension getPreferredSize() {
           if (icon != null) {
                return new Dimension(image.getWidth(), image.getHeight());
            } else {
                return super.getPreferredSize();
          }
       }
    }
```


----------



## iChaos (1. Jul 2010)

```
public GuiElements() throws IOException {

		this.setLayout(new BorderLayout());
		JPanel panelConnect = new JPanel(new FlowLayout(FlowLayout.LEFT));
		labelIP = new JLabel("IP:");
		textFieldIP = new JTextField("localhost");
		labelPort = new JLabel("Port:");
		textFieldPort = new JTextField("666");
		textFieldPort.setFocusable(false);
		bi = ImageIO.read(new File("background.jpg"));

		buttonGroupChoose = new ButtonGroup();
		radioButtonHost = new JRadioButton("Host", true);
		radioButtonClient = new JRadioButton("Client");

		buttonConnect = new JButton("Connect!");

		buttonGroupChoose.add(radioButtonHost);
		buttonGroupChoose.add(radioButtonClient);
		
//		panelConnect.add(labelIP);
//		panelConnect.add(textFieldIP);
//		panelConnect.add(labelPort);
//		panelConnect.add(textFieldPort);
//		panelConnect.add(radioButtonHost);
//		panelConnect.add(radioButtonClient);
//		panelConnect.add(buttonConnect);

		panelChat = new JPanel(new FlowLayout(FlowLayout.LEFT));
		
		
		textAreaChat = new JTextArea(20, 55);
		textAreaChat.addKeyListener(this);
		textAreaChat.setEditable(false);
		JScrollPane scrollPaneChat = new JScrollPane(textAreaChat);
		textFieldNickname = new JTextField("First type Nickname here!!!", 5);
		textFieldNickname.addKeyListener(this);
		textFieldMessage = new JTextField(40);
		buttonSend = new JButton("Senden");
		buttonHide = new JButton("Hide");
		buttonHide.addActionListener(this);
		buttonHide.addKeyListener(this);
		buttonHide.setMnemonic(KeyEvent.VK_0);

		JPanel panelSend = new JPanel(new FlowLayout(FlowLayout.LEFT));
		panelSend.add(textFieldNickname);
		panelSend.add(textFieldMessage);
		panelSend.add(buttonSend);
		panelSend.add(buttonHide);

//		panelChat.add(scrollPaneChat);
//		panelChat.add(panelSend, new GridLayout(1, 3));
//
//		buttonConnect.addActionListener(this);
//		buttonSend.addActionListener(this);
//		textFieldMessage.addActionListener(this);

//		this.add(panelConnect, BorderLayout.NORTH);
//		this.add(panelChat, BorderLayout.CENTER);

	}

	
	public void paintComponent(Graphics g) {
		if(bi!=null){
			System.out.println("here");
		g.drawImage(bi, getWidth(), getHeight(), panelChat);
		}
	}
```


Hier der Code...
Hab mal probiert indem ich alles auskommentiere, jedoch erscheint ebenfalls kein Bild.
das mitdem Syso funktioniert jedenfalls!


----------



## Michael... (2. Jul 2010)

In den meisten Fällen sollte man in einer überschriebenen paintComponent() auch die super.paintComponent() aufrufen.

Hast Du Dir mal in der Doku die Methode Graphics#drawImage angeschaut, welche Eingabeparameter diese erwartet? Und geschaut an welcher Position Du das Bild zeichnest?



iChaos hat gesagt.:


> ```
> g.drawImage(bi, getWidth(), getHeight(), panelChat);
> ```


----------



## iChaos (2. Jul 2010)

gut das mit dem Bild zeichnen hat prima geklappt; 

jedoch ist nun mein TextArea im Weg; gibt es einen Weg das TextArea transparent zu machen? mit einem alpha wert setzen klappts nicht... am besten wäre ne methode wie setWindowOpacity() xD

hat jemand Vorschläge`?
---------

läuft; musste scrollpane und textarea auf 0,0,0,0 setzen!


----------

