Swing setContentPane verdeckt mir alle Buttons Labels etc...

xJan45x

Aktives Mitglied
Hallo,
Ich habe ein kleines Problem und einfach keine Lösung gefunden. Und zwar habe ich ein JFrame und habe mir ein Hintergrund Bild erstellt und ich wollte das gerne wenn man das Bild groß macht das der Hintergrund auch mit Groß wird Das Habe ich auch hinbekommen. Aber meine ganzen JButtons, JLabels, JCheckBoxs sind jetzt alle hinter dem HintergrundBild und ich will sie gerne vor dem Bild haben. Wenn ich den Hintergrund mit ein JLabel mache dann passt sich das Bild nicht an wenn man es groß macht. Deswegen habe ich setContentPane() genommen. Das Bild wir auch angezeigt aber wie gesagt meine ganzen Compomenten sind halt hinter dem Bild und ich möchte sie gerne davor haben.
Wie kann ich das machen?
 

Gucky

Top Contributor
Mit setContentPane() werden deine Buttons nicht verdeckt sondern sie werden einfach nicht mehr angezeigt.
Guck dir mal den ComponentListener an.

Du erweiterst ein JLabel, lässt es ComponentListener erweitern, fügst es zum JFrame als ComponentListener hinzu und überschreibst die ComponentRezized() Methode im erweiterten JLabel. In diese Methode schreibst du die Anpassung an die veränderte Größe des JFrames.

Also in Code:

Java:
public class HintergrundLabel extends JLabel implements ComponentListener{

 @Override
 public void componentRezized(ComponentEvent e){
  Rectangle frameRect = e.getComponent().getBounds();
  int höhe = frameRect.getHeight();
  int breite = frameRect.getWidth();
  //Mach deine Anpassungen
 }
}

und zum Frame fügst du das Label mit
Java:
frame.addComponentListener(new HintergrundLabel());
hinzu.
 
Zuletzt bearbeitet:

xJan45x

Aktives Mitglied
Bei mir wird das Hintergrund Bild nicht angezeigt. Ich habe eine Klasse erstellt die "SingelPlayerCompmentenListener" heißt. In der Klasse habe ich dann hingeschreiben "extends JLabel implements ComponentListener" hinter denn Klassen namen. Dann habe ich die Methoden implementiert und habe in der Methode "componentResized" Folgenes rein geschrieben:
Java:
	@Override
	public void componentResized(ComponentEvent e) {
		Rectangle frameRect = e.getComponent().getBounds();
		int höhe = (int) frameRect.getHeight();
		int breite = (int) frameRect.getWidth();
		setSize(breite, höhe);
		try {
			setIcon(new ImageIcon(ImageIO.read(getClass().getResource("background.png"))));
		} catch (IOException e1) {
			e1.printStackTrace();
		}
	}
Und bei mein JFrame habe ich dieses hingeschreiben:
Java:
	addComponentListener(new SingelPlayerCompmentenListener());
Aber wenn ich die Anwendung Starte habe ich einfach nur ein weißen Hintergrund. Die Datei "background.png" ist vorhanden!
Aber warum wird mir mein Hintergrund Bild nicht angezeigt habe ich was falsch gemacht? Falls ja was?
 

Gucky

Top Contributor
Du lädst das Icon jedes Mal neu. Es ist besser, wenn du es ein mal einließt und dann im Speicher behältst. Die Festplatte ist im Gegensatz zum Rest extrem langsam.

Der Code von mir war nur ein Beispiel. Du musst das JLabel natürlich trotzdem zu deinem ContentPane hinzufügen. ;)
 

xJan45x

Aktives Mitglied
Wie kann ich das Image Speichern?
Muss ich das JLabel dann ganz normal wieder hinzufügen als wenn es ein normales JLabel(Also setSize, frame.add())?
Oder wie?
 
Zuletzt bearbeitet:

Gucky

Top Contributor
In einer Variable vom Typ ImageIcon. So schwer ist das nicht. ;)

Ja. So wäre das. Du fügst es so hinzu, dass es anfangs framefüllend ist. Alle weiteren Anpassungen an veränderte Größen nimmst du in componentResized(...) vor.



Noch eine Sache: Man bennent Klassen nicht nach dem Interface, dass sie implementieren sondern nach der Aufgabe, die sie erfüllen. Dein JLabel hieße also z. B. HintergrundJLabel ;)
 

xJan45x

Aktives Mitglied
Also speichere ich das Bild im ImageIcon dann lade ich es beim aufrufen des Consturtors. Und wenn ich das Bild maxiemiere also componentResized(...) Event setzte ich einfach die Size vom Label auf die neue Größe mit Height und Width? Und dann bei mein Frame repaint() aufrufen richtig?
Und halt noch dann ganz normal adden zum frame wie ein normales JLabel und den Listener adden
 
Zuletzt bearbeitet:

Gucky

Top Contributor
Das mit dem ImageIcon sähe so aus:
Java:
public class Hinterlabel extends...{
 private ImageIcon hintergrund;

 public Hinterlabel(...){
  hintergrund = ImageIO.....;
 }
}

Das du die Größe anpasst stimmt. Nur vermutlich müsstest du auch die Größe des Icons anpassen.
Wozu brauchst du denn JFrame.repaint()?

Das Hinzufügen stimmt.
 

xJan45x

Aktives Mitglied
Bei mir sieht die Klasse jetzt so aus
Java:
public class BackgroundJLabel extends JLabel implements ComponentListener{

	private static final long serialVersionUID = 5627376614400938558L;
	private ImageIcon icon = null;
	
	public BackgroundJLabel() {
		try {
			icon = new ImageIcon(ImageIO.read(getClass().getResource("bg.png")));
		} catch (IOException e) {
			e.printStackTrace();
		}
		setIcon(icon);
	}
	
	@Override
	public void componentResized(ComponentEvent e) {
		Rectangle frameRect = e.getComponent().getBounds();
		int höhe = (int) frameRect.getHeight();
		int breite = (int) frameRect.getWidth();
		int x = (int) frameRect.getX();
		int y = (int) frameRect.getY();
		setBounds(x, y, breite, höhe);
		setIcon(icon);
	}

	@Override
	public void componentMoved(ComponentEvent e) {}

	@Override
	public void componentShown(ComponentEvent e) {}

	@Override
	public void componentHidden(ComponentEvent e) {}


}

Und benutzen tut ich das ganz so:
Java:
	private JLabel bglabel;
		bglabel = new BackgroundJLabel();
		add(bglabel);
		addComponentListener(new BackgroundJLabel());
Also ich habe in der Klasse extends JFrame drin stehen. Aber mein Hintergrund ist immer nur dann Weis Warum?
 

Gucky

Top Contributor
Du musst bglabel als ComponentListener hinzufügen und kein neues Label sonst klappt das nicht.

Und, sofern du nicht mit einem LayoutManager arbeitest, musst du bglabel einw Größe mitgeben.
 
Zuletzt bearbeitet:

xJan45x

Aktives Mitglied
Also ich weis nicht was ich da falsch mache ich habe jetzt einfach addComponentListener(new BackgroundLabel()); gemacht aber es geht immer noch. Wie man mit denn LayoutManager arbeitet weis ich nicht genau
 

Gucky

Top Contributor
Du erzeugst eine neue Instanz von BackgroundLabel und fügst diese als Listener hinzu und vorher erzeugst du eine Instanz und fügst diese zum ContentPane hinzu. Du hast also insgesamt zwei Instanzen. Du musst aber beide Male DASSELBE HintergrundPanel hinzufügen.
 

Mika

Mitglied
Nochmal zu deinem ursprünglichen Problem: Du willst ein Programm machen, dass aus einem JFrame besteht. Dabei möchtest du ein Bild als Hintergrund einfügen, ohne dabei die anderen Komponenten zu verdecken. Ich habe schon mal ein solches Programm geschrieben und dabei habe ich einfach ein JLabel als ContentPane des JFrames benutzt:

Code:
frame.setContentPane(new JLabel());

Diesem JLabel habe ich ein ImageIcon gegen (für den Hintergrund halt). Aber genug geredet, hier mal die gesamte Klasse:

Java:
package XXX.XXX.XXX;

import java.awt.FlowLayout;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class FensterMitHintergrund extends JFrame {
	
	public FensterMitHintergrund() {
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		setSize(500, 500);
		setLocationRelativeTo(null);
		setContentPane(new JLabel(new ImageIcon("PFAD/ZUM/HINTERGRUNDBILD.png"))); 
		FlowLayout layout = new FlowLayout();
		getContentPane().setLayout(layout);
		getContentPane().add(new JButton("Ich bin ein JButton"));
	}

	public static void main(String[] args) {
		FensterMitHintergrund window = new FensterMitHintergrund(); 
		window.setVisible(true);
	}	
}

Diese Klasse erzeugt beim Starten ein JFrame-Objekt mit einem Hintergrundbild (falls der Pfad gültig ist und das Bild existiert). Außerdem wird ein JButton dem ContentPane hinzugefügt, welches problemlos im Vordergrund gezeichnet wird.
Ich rate dir sehr, dass du das NimbusLookAndFeel benutzt, da die Ränder von bspw. JButtons sonst weiß werden.

MfG Mika
 
Zuletzt bearbeitet:

kaoZ

Top Contributor
ich würde einfach das von dir gewünschte bild in einem JPanel realisieren, und diesen dann einfach als ContentPane für deinen Frame verwenden ,

alle anderen Komponenten weißt du dann über das Borderlayout des JFrames die dementsprechende Position zu .

Hier ein Beispiel ( alle Komponenten werden 'automatisch' ÜBER deinem Hintergrundbild angeordnet ):

Das ImagePane ist so umgesetzt, das es automatisch die Größe deiner Grafik annimmt, und ein aufruf von pack() der klasse JFrame in der Klasse Main.java sorgt dafür das der Frame so groß wird wie der inhalt seiner contentPane.

ImagePane.java
Java:
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JPanel;


@SuppressWarnings("serial")
public class ImagePane extends JPanel{

	private BufferedImage image;
	
	public ImagePane(String file){
		loadImage(file);
		init();
	}
	
	private void loadImage(String file){
		try {
			image = ImageIO.read(new File(file));
		}
		catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	private void init(){
		setPreferredSize(new Dimension(image.getWidth(), image.getHeight()));
	}
	
	@Override
	public void paintComponent(Graphics g){
		super.paintComponent(g);
		
		g.drawImage(image, 0, 0, null);	
	}
	
	public BufferedImage getImage()				{return image;}
}


EDIT :

falls du das Image als resource laden möchtest ( also das Bild in einem Ordner , innerhalb deiner Projektstruktur liegen sollte ), kannst du dies mit

Java:
try{
  image = ImageIO.read(getClass().getResourceAsStream(file);
catch(IOException e){
  e.printStrackTrace();
}
}

machen.

Main.java
Java:
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class Main{

	public static void main(String[] args){
		JFrame f = new JFrame("Mein Frame");
		f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		
		
//		Hintergrund setzen ( automatisch ist der Frame so groß wie das Bild )
		f.setContentPane(new ImagePane("F:/Bilder/Wallpaper/1.jpg"));
		
//		Beliebige Komponenten hinzufügen 
		f.add(BorderLayout.PAGE_START, new JLabel("Ich bin ein tolles JLabel"));
		
		f.pack();
		f.setLocationRelativeTo(null);
		f.setVisible(true);
	}
}

oder du gehst den Weg den Gucky dir bereits beschrieben hatte.

Den Weg zu wählen und von JFrame abzuleiten würde ich eher nicht empfehlen.
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
DeeDee0815 setContentPane()-Problem bei JInternalFrame AWT, Swing, JavaFX & SWT 2
K Panel verdeckt MenuItem AWT, Swing, JavaFX & SWT 5
kaoZ Swing JToolBar, ImageIcon werden teilweise verdeckt AWT, Swing, JavaFX & SWT 0
G JLabel verdeckt AWT, Swing, JavaFX & SWT 12
M Swing JMenu verdeckt durch Komponente (aber kein AWT und Swing mix!?) AWT, Swing, JavaFX & SWT 3
Psypsy Swing Abfragen ob ein Fenster verdeckt ist AWT, Swing, JavaFX & SWT 5
F Swing MenuBar wird verdeckt AWT, Swing, JavaFX & SWT 2
H nicht modaler Dialog verdeckt modalen Dialog AWT, Swing, JavaFX & SWT 5
D Drag and Drop-Möglichkeit wird von Komponenten verdeckt! AWT, Swing, JavaFX & SWT 2
M Combobox verdeckt Menü AWT, Swing, JavaFX & SWT 2
G Button werden verdeckt AWT, Swing, JavaFX & SWT 5
G menu wird verdeckt AWT, Swing, JavaFX & SWT 4
R JButton background verdeckt gemaltes AWT, Swing, JavaFX & SWT 6
E Einträge der JComboBox werden durch Grafik verdeckt AWT, Swing, JavaFX & SWT 11
_user_q Gibt es eine Möglichkeit, in Java alle möglichen Zeichen automatisch tippen zu lassen? AWT, Swing, JavaFX & SWT 13
_user_q JavaFX Wie kann ich alle Objekte außer eins deaktivieren (das Gleiche mit BoxBlur)? AWT, Swing, JavaFX & SWT 11
Davee JavaFX JavaFX Jar ausführbar jedoch nicht alle Stages AWT, Swing, JavaFX & SWT 3
F JFrame zeigt nicht alle Elemente auf anhieb an AWT, Swing, JavaFX & SWT 4
B Swing JButton deaktivieren, wenn nicht alle JTextFields ausgefüllt sind. AWT, Swing, JavaFX & SWT 2
S ActionListener für alle Buttons AWT, Swing, JavaFX & SWT 26
D JavaFX Alle Knöpfe auf die gleiche Größe AWT, Swing, JavaFX & SWT 14
M Gui-Form alle Labels anzeigen AWT, Swing, JavaFX & SWT 4
M Alle Schriftarten in JComboBox AWT, Swing, JavaFX & SWT 5
N Swing Alle Objekte anzeigen auch bei JPanel-Überlappung AWT, Swing, JavaFX & SWT 6
Bluedaishi JTable alle Zeilen löschen AWT, Swing, JavaFX & SWT 7
J CellEditorListener wird für ALLE Zellen ausgeführt AWT, Swing, JavaFX & SWT 2
T Alle Swing-Elemente anzeigen AWT, Swing, JavaFX & SWT 9
A JDialog (modal) blockiert alle Fenster! AWT, Swing, JavaFX & SWT 2
J Alle Komponenten eines JFrames durchlaufen AWT, Swing, JavaFX & SWT 2
P Swing Alle Zeilen einer Spalte (jTable) zusammen zählen und in eine eigene Zeile das Ergebnis schreiben. AWT, Swing, JavaFX & SWT 7
C Swing JTattoo - Look and Feel für ALLE User AWT, Swing, JavaFX & SWT 5
T Swing Font für alle Komponenten ändern AWT, Swing, JavaFX & SWT 2
A Swing Alle Komponenten auf JFrame ermitteln AWT, Swing, JavaFX & SWT 4
O JFrame: Daten alle paar Sekunden aktualisieren AWT, Swing, JavaFX & SWT 3
X Alle Components eines JPanels Enablen AWT, Swing, JavaFX & SWT 7
AyKay SWT (alle) Listener bzw. ModifyEventListener entfernen AWT, Swing, JavaFX & SWT 2
D Funktion JList.getSelectedValues() gibt nicht alle values zurück AWT, Swing, JavaFX & SWT 2
E Swing TableCellRenderer für alle Splaten setzen?! AWT, Swing, JavaFX & SWT 3
V Alle offenen jDialoge schliessen AWT, Swing, JavaFX & SWT 3
M Alle Frame Methoden AWT, Swing, JavaFX & SWT 2
L 3D-Grafik Java3D - Alle SceneGraphObjects geordnet erhalten AWT, Swing, JavaFX & SWT 2
F Nicht alle Bilder werden angezeigt AWT, Swing, JavaFX & SWT 2
Iron Monkey Alle Anwendungen werden miniert AWT, Swing, JavaFX & SWT 2
D ALLE exceptions in Log fenster anzeigen AWT, Swing, JavaFX & SWT 17
C JTable: Alle selektierten Zellen abfangen AWT, Swing, JavaFX & SWT 13
J alle Ordner in einem Ordner anzeigen(Jlist) AWT, Swing, JavaFX & SWT 44
M Swing Dankeschön an alle AWT, Swing, JavaFX & SWT 8
S Java3D: Alle Objekte in BranchGroup löschen während Laufzeit AWT, Swing, JavaFX & SWT 3
kodela alle Buttons einer ToggleButtonGroup deselektieren AWT, Swing, JavaFX & SWT 2
Milady Annzeigen alle Daten aus der Tabelle AWT, Swing, JavaFX & SWT 6
B MDI Anwendung alle maximierten InternalFrames in Tabs AWT, Swing, JavaFX & SWT 3
J Swing Monospace-Schrift für alle Systeme AWT, Swing, JavaFX & SWT 3
M Swing Alle Elemente eines Panels? AWT, Swing, JavaFX & SWT 9
J Swing Eine(und zwar ein und die selbe) WindowListener Instanz für alle JFrames AWT, Swing, JavaFX & SWT 8
J Swing Alle JFrames AWT, Swing, JavaFX & SWT 18
aze JTextfield nur so breit dass alle zeichen sichtbar sind AWT, Swing, JavaFX & SWT 2
R Swing alle Frames nutzen das gleiche Model AWT, Swing, JavaFX & SWT 2
André Uhres Swing Alle Komponenten eines JPanel aktivieren/deaktivieren AWT, Swing, JavaFX & SWT 4
E Im Frame alle Componenten abrufen AWT, Swing, JavaFX & SWT 2
K Alle Events abfangen mit GlassPane AWT, Swing, JavaFX & SWT 7
T JTree - alle Nodes entfernen AWT, Swing, JavaFX & SWT 8
D JCheckBoxItem in Untermenüs alle gleichzeitig an- bzw. aus AWT, Swing, JavaFX & SWT 3
E Drag&Drop JTable; Renderer füllt alle Zellen AWT, Swing, JavaFX & SWT 10
G Alle Werte einer Spalte in JTable zusammenrechnen AWT, Swing, JavaFX & SWT 2
G Alle Komponenten eines JPanels durchlaufen AWT, Swing, JavaFX & SWT 11
T Alle Folgefenster sollen im Hauptfenster geöffnet werden AWT, Swing, JavaFX & SWT 3
P Alle Komponenten von JPanel in der Mitte entfernen AWT, Swing, JavaFX & SWT 2
G Eine Schiftart für alle Komponenten festlegen AWT, Swing, JavaFX & SWT 6
G WindowListener für alle Fenster AWT, Swing, JavaFX & SWT 4
H <Synth> Alle die sich auskennen Bitte hier rein schaue AWT, Swing, JavaFX & SWT 2
Paule alle Elemente eines SWT Trees AWT, Swing, JavaFX & SWT 8
H JFileChooser für alle Dateien und Directories unterhalb AWT, Swing, JavaFX & SWT 7
C Beim Schließen eines fensters, schließen sich alle AWT, Swing, JavaFX & SWT 5
G Nicht alle Komponenten werden angezeigt AWT, Swing, JavaFX & SWT 8
S Alle EventListener einer JComponent abfragen? AWT, Swing, JavaFX & SWT 3
0 JList alle 20 Sekunden aktualisieren? AWT, Swing, JavaFX & SWT 8
K Graphics-Objekt zeichnet nicht alle Bilder AWT, Swing, JavaFX & SWT 3
M Listener für alle inneren Elemente gültig machen? AWT, Swing, JavaFX & SWT 5
M JList zeigt nicht alle Elemente AWT, Swing, JavaFX & SWT 4
B Alle URLs aller offenen Browser. AWT, Swing, JavaFX & SWT 12
N Alle Pixel-Koordinaten von z.B. g.drawLine(.) speichern AWT, Swing, JavaFX & SWT 7
L Alle Inhalte in BorderLayout.CENTER löschen? AWT, Swing, JavaFX & SWT 2
N Alle Komponenten eines JPanel aktivieren/deaktivieren? AWT, Swing, JavaFX & SWT 5
J [SWT] alle Zellen in einem Tree einzeln selektieren AWT, Swing, JavaFX & SWT 2
T JTree alle nodes expanden AWT, Swing, JavaFX & SWT 4
M Hauptfenster und alle Kinder schließen? AWT, Swing, JavaFX & SWT 7
T Alle Kinder eines JTree bekommen AWT, Swing, JavaFX & SWT 11
G Double-Click f. alle Komps UNIX u. WIN verschieden ? AWT, Swing, JavaFX & SWT 5
P TableCellRender für ALLE Spalten AWT, Swing, JavaFX & SWT 10
G Alle Elemente eines JPanel herausfinden? AWT, Swing, JavaFX & SWT 3
Luma Alle Fenster verstecken und wieder sichtbar machen? AWT, Swing, JavaFX & SWT 6
D Alle Inhalte einer JTextArea in einem JScrollPane löschen AWT, Swing, JavaFX & SWT 2
P JTree: Alle Knoten geöffnet anzeigen AWT, Swing, JavaFX & SWT 2
P JTree: alle Elemente ausklappen AWT, Swing, JavaFX & SWT 3
bernd JTree: alle Laufwerke anzeigen AWT, Swing, JavaFX & SWT 3
B Alle jMenu und JMenuItem in einem Array AWT, Swing, JavaFX & SWT 4
R removeAll() beseitigt nicht alle Komponenten!? AWT, Swing, JavaFX & SWT 11
M JTabbedPane zeigt alle Panels übereinander an :( AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben