# durchsichtiges JTextField mit Hintergrund



## BobbGott (26. Jan 2017)

Hallo Community,
ich sitze nun geschlagene 3 Tage an dem gleichen Problem und trotz Googlen und etliche Foreneinträgen auf Deutsch und Englisch, bin ich nicht auf die Lösung gekommen und würde gerne euren Rat erbitten.

Ich habe ein JFrame mit BorderLayout. Im Center befindet sich ein JTextField, welches immer wieder mit neuem Text gefüllt wird (Habe hier setText benutzt). Nach etlichen versuchen mit JTextArea bin ich auf JTextField geswitched und habe name.setOpaque(false) gefunden. vorher noch mit new JPanel und setColor einen gelben Hintergrund hinzugefügt im Center um es leichter zu testen(später soll es ein Bild werden und auf Befehl wechseln -> das zeichnen habe ich schon).
Wenn ich nun aber mein TextField hinzufüge, ist die Hintergrundfarbe immer das Basic grau. Wenn ich es nicht adde erscheint das gewollte Gelb.
Wie schaffe ich das, dass ich Text vor dem Gelb (später ein Bild) ?

Hier mal das was wichtig ist (denke ich):


```
public Fenster(){
        super ("Gladiator Tabelle");
        final KampfStatTabelle Kampf = new KampfStatTabelle();
        this.getContentPane().add(new GladiatorenAuswahl("Gladiator-Wahl", 4,1,  Kampf.getGladNamenArray()), BorderLayout.EAST);
     
// TEST 
        JPanel hintergrund = new JPanel();
        hintergrund.setLayout (null);
        hintergrund.setBackground(Color.YELLOW);
        getContentPane().add(hintergrund,BorderLayout.CENTER);
// Gelber Hintergrund
        
        centerTxt = new JTextField();
            add(centerTxt,BorderLayout.CENTER);
            centerTxt.setEditable(false);
            centerTxt.setOpaque(false);

        ortAngabe = new JLabel("Du befindest dich derzeit im Roemischen Kolloseum");
            getContentPane().add(ortAngabe,BorderLayout.NORTH);
            ortAngabe.setForeground(Color.red);
            ortAngabe.setBackground(Color.white);
            ortAngabe.setHorizontalAlignment(JTextField.CENTER);
       
       
        //Hintergrund(Kampf.getOrt());
           
        //    String Ort = "Rom";
        //    BackgroundPanel backgroundPanel = new BackgroundPanel(Ort);
            //add(backgroundPanel, BorderLayout.CENTER);
```


DANKE IM VORRAUS


----------



## Joose (26. Jan 2017)

BobbGott hat gesagt.:


> Wenn ich nun aber mein TextField hinzufüge, ist die Hintergrundfarbe immer das Basic grau. Wenn ich es nicht adde erscheint das gewollte Gelb.


Wessen Hintergrundfarbe ist dann diese basic grau? Vom Panel oder Textfield?



BobbGott hat gesagt.:


> Wie schaffe ich das, dass ich Text vor dem Gelb (später ein Bild) ?


Wie schaffst du was genau? Die Frage ist unverständlich  irgendwas fehlt da.

Warum fügst du dem Fenster Objekt das Textfield hinzu und nicht dem Panel?


----------



## BobbGott (26. Jan 2017)

> Wessen Hintergrundfarbe ist dann diese basic grau? Vom Panel oder Textfield?


Die Grundfarbe vom JFrame über Eclipse auf Linux gestartet. Hat immer so ein LightGrey - wenn kein Inhalt vorhanden oder Background gesetzt ist.



> Wie schaffst du was genau? Die Frage ist unverständlich


 - meinte natürlich, wie schaffe ich es, dass der Text vor dem Hintergrund steht aber beide sichtbar sind (Text "auf" dem Hintergrundbild/farbe)



> Warum fügst du dem Fenster Objekt das Textfield hinzu und nicht dem Panel?


Ist mein erstes richtige GUI/Swing/Java Projekt und da noch feucht hinter den Ohren. In Meiner Unendlichen Weisheit kam die Vorstellung auf, dass wie bei Photoshop die Ebenen so sind.
Habe es jetzt mal dem Panel hinzugefügt und das gleiche Problem wie vorher, bloß andersum.
Ich sehe nun den Gelben Hintergrund, aber die Schrift erscheint nicht auf Befehl -> sozusagen "dahinter"

Und danke schonmal für die schnelle antwort


----------



## SF2311 (27. Jan 2017)

Versuch es mal mit:

```
centerText.setBackground(new Color(0,0,0,0))
centerText.setBorder(null);
```
Die letzte Zahl gibt die Opacity der Farbe an.


----------



## BobbGott (30. Jan 2017)

setBackground geht nur bei TextArea, aber nicht bei TextField


----------



## SF2311 (30. Jan 2017)

Ich hab das gerade nochmal probiert und das geht einwandfrei!


----------



## BobbGott (30. Jan 2017)

BobbGott hat gesagt.:


> setBackground geht nur bei TextArea, aber nicht bei TextField


Sorry, weis auch nicht mehr genau, aber als ich es zu JTextField geändert hatte ging es nicht. Habe es jetzt gelöst bekommen:

mein BackgroundPanel

```
import java.awt.Graphics;
import java.awt.Image;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;


public class BackgroundPanel extends JPanel {

        private Image img;
       
       

        public BackgroundPanel(String Ort) {
            try {
                if(Ort.equals("Rom")){
                    img = ImageIO.read(getClass().getResource("gamePanel.jpg"));
                }else if(Ort.equals("Alexandria")){
                    img = ImageIO.read(getClass().getResource("gamePanel2.jpg"));
                }else if(Ort.equals("Konstantinopel")){
                    img = ImageIO.read(getClass().getResource("gamePanel3.jpg"));
                }else{
                    throw new RuntimeException("Kein Bild vorhanden");
                }
            }catch (IOException e){
                e.printStackTrace();
            }
        }

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.drawImage(img, 0, 0, this);
        }

    }
```

und ich habe es wie folgt eingebunden

```
BackgroundPanel hintergrund = new BackgroundPanel("Rom");
        hintergrund.setLayout(new BorderLayout());
        add(hintergrund);

        JTextField centerTxt = new JTextField("Hello World");
            centerTxt.setFont(centerTxt.getFont().deriveFont(Font.BOLD, 16));
            centerTxt.setForeground(Color.BLUE);
            centerTxt.setOpaque(false);
            centerTxt.setBorder(null);
            centerTxt.setEditable(false);
                           hintergrund.add(centerTxt);
```

Weiß ehrlich gesagt auch nicht was ich vorher falsch gemacht hatte, habe es nochmal komplett neu mit Forum hilfe zusammen gestellt. Nach ein paar Tagen gefunden. Natürlich ist davon nicht alles wichtig und manches wie Color.BLUE nur für mein Programm.
Achj und das "Rom" wird auch nur übergeben, da ich je nach Situation die Bilder änder. SwitchCase wäre dort vill. besser

Nochmal danke


----------



## SF2311 (30. Jan 2017)

Du kannst auch eine HashMap dafür verwenden und den Strings die Bilder zuordnen:

```
private HashMap<String,Image> pictures = new HashMap<>();
pictures.put(String name,Image image);
....
g.drawImage(pictures.get(name),0,0,this);
```


----------



## BobbGott (30. Jan 2017)

Habe ich noch nie mit gearbeitet und leider bald abgabe.
gibt es eig. eine schnelle/einfache Möglichkeit, die Bilder zu wechseln.
Habe es derzeit so gemacht einfach das Hintergrundbild zu überschreiben, allerdings (wie erwartet) wenn ich es minimiere oder das Menü öffne kommt immer das alte Bild durch


----------



## SF2311 (30. Jan 2017)

Mit:

```
g.clearRect(0,0,width,heigth)
```
könnte es klappen


----------



## BobbGott (30. Jan 2017)

```
@Override
        protected void paintComponent(Graphics g) {
            g.clearRect(0,0,650,530);
            super.paintComponent(g);
            g.drawImage(img, 0, 0, this);
        }
```

habe es so verstanden, klappt da leider nicht.


----------



## SF2311 (30. Jan 2017)

Der Aufruf 
	
	
	
	





```
super.paintComponent(g);
```
muss (wie alle super.etc Aufrufe) in die erste Zeile.


----------



## SF2311 (30. Jan 2017)

Deine HashMap müsste so aussehen:

```
HashMap<String,Image> pictures = new HashMap<String, Image>();
        pictures.put("Rom", ImageIO.read(new File(getClass().getResource("gamePanel.jpg")));
        pictures.put("Alexandria", ImageIO.read(new File(getClass().getResource("gamePanel2.jpg")));
        pictures.put("Konstantinopel", ImageIO.read(new File(getClass().getResource("gamePanel3.jpg")));
```
und in der PaintComponent()methode dann:

```
g.draw(pictures.get(Ort);,0,0,this);
```
Das ist eleganter als ein if- oder switch-block.


----------

