SWING Fenster mit mehreren JPanels (dank JLayeredPane)

Status
Nicht offen für weitere Antworten.

javaianer

Mitglied
Ich möchte ein Swing Fenster (JFrame) mit Hintergrundbild haben. Dieses Hintergrundbild soll teilweise von einem Bereich (JPanel) verdeckt werden, auf dem die Methode paint zu nutzen ist.

Bisher habe ich es hinbekommen, ein JFrame mit Hintergrundbild zu erzeugen, welches von contentPane.add("bild.jpg") verdeckt wird. Aber ich bekomme es einfach nicht hin, dass auch ein JPanel das Hintergrundbild verdeckt.

Schon mal vielen dank!

(Ich weiss es ist knapp beschrieben, aber ich hätte einfach gerne die einfachste Möglichkeit.
Hintergrund, was ich damit anfangen möchte:
Ein Spiel soll ein Hintergrund haben und auf diesem soll ein Bereich sein, mit schwarzem Hintergrund auf dem über die paint Methode gezeichnet wird.
Mich interessieren keine Listener, sondern einfach nur die Visualisierung.)
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Das Bild:
Java:
JLabel contentPane = new JLabel();
ImageIcon backgroundImage = null;
try {
    backgroundImage = new ImageIcon(ImageIO.read(getClass().getResource("/images/bubbles.gif")));
} catch (IOException ex) {
    ex.printStackTrace();
}
contentPane.setIcon(backgroundImage);
frame.setContentPane(contentPane);

Das JPanel:
Java:
JPanel p = new JPanel(){
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.BLACK);
        g.fillRect(0, 0, getWidth(), getHeight());
    }
};
p.setPreferredSize(new Dimension(200,200));
contentPane.setLayout(new FlowLayout());
contentPane.add(p);

Siehe auch: Background Panel Java Tips Weblog
 

javaianer

Mitglied
Danke. Aber ich habe gelesen, dass man ImageIcon für Icons an sich verwenden sollte und beim Ausgeben von Bildern Image. Da das fürs Studium ist, würde ich das daher auch gerne mit Image machen.

Wäre es nicht eigentlich am schönsten, wenn ein JFrame erzeugt werden würde. Dann JPanels auf denen Bilder gezeichnet werden und die JPanels dann auf die ContentPane gepackt werden würden? Ich versuch das grad, aber irgendwie zeigt er mir nicht mein Bild an.
 
Zuletzt bearbeitet:

javaianer

Mitglied
Mir ist eigentlich immer noch unklar, auf welche JComponents man überhaupt malen kann und wofür welche Componente ist.

Ist das richtig, dass man auf jeder Klasse die von Jcomponent erbt malen kann?
 

javaianer

Mitglied
Es kann auch sein, dass ich was beim zeichnen des Bildes falsch mache. Ich versuche es so zu machen:

Image img = Toolkit.getDefaultToolkit.createImage("bild.JPG");

dann in

protected paintComponent(Graphics g) {
g.drawImage(img, anfangsPunktX, anfangsPunktY, this);

this ist doch ein ImageObserver oder?
 

javaianer

Mitglied
Ich bin etwas weiter gekommen, wenn ich alles in einer Klasse mache geht es und zwar mit folgenden Mitteln:
Image img = Toolkit.getDefaultToolkit().getImage(bild.JPG);
(Image img = Toolkit.getDefaultToolkit().getImage(bild.JPG); ) geht auch, aber für mich ist getImage besser!

Mit folgendem wird das geladene Bild gezeichnet:
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(img, 0, 0, this);
}

Erzeugt wird:
JFrame myFrame = new JFrame();
Container myContainer = myFrame.getContentPane();
ContentPane.add(Objekt des JPanels, mit dem zuzeichnenden Bild)

Aber wenn ich das nun aufsplitte in drei Klassen;
eine Testklasse
eine Klasse, die von JFrame erbt
eine Klasse, die von JPanel erbt
geht es nicht mehr.

An welcher Stelle muss denn JFrame auf visible geschaltet werden?
 

javaianer

Mitglied
Kann man mehrere Jpanels aufeinanderlegen? SO dass wenn das untere Größere ist als die darüber immer noch ein Teil von dem darunter zu sehen ist?
 

javaianer

Mitglied
So ich habe es nun meiner Meinung nach so simpel wie möglich gelöst. (Würde daraus gerne eine Hilfe für jedermann machen, daher schaut euch mal die 4 kleinen Klassen an und schreibt eure Anmerkungen und Kritiken. Speziell, denke ich, dass der Konstruktor zu voll ist und da einiges von besser in einer Methode aufgehoben wäre. Wenn dann das "perfekt" ist eröffne ich einen neuen Thread)

Hiermit ist es möglich auf einem Hintergrundbild alles weitere was eine GUI haben kann drauf zu packen.

Test-Klasse
Code:
public class TestWindow {

	public TestWindow() {
	}

	public static void main(String[] args) {
		//JFrame wird erst zum Schluß sichtbar gemacht!
		new MainWindow().setVisible(true);

	}

}

Hauptfenster-Klasse

Code:
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class MainWindow extends JFrame {
	
	JLayeredPane layeredPane;
    JPanel background, panelOne;
    
    Integer layerOne = JLayeredPane.FRAME_CONTENT_LAYER + 1;
    //Für weitere Layer (Ebenen)
    //Integer layerTwo = layerOne + 1;

	public MainWindow() {
		super("Endlich Hintergrund mit Inhalt");
		setSize(1024, 768);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
        background = new Picture("Hintergrund.JPG", 1024, 768);
        background.setBounds(0, 0, 1024, 768);
		
		panelOne = new Field();
		//Position dieses Panels
        panelOne.setBounds(358, 76, 651, 651);
       
        layeredPane = getLayeredPane();
        //JPanel mit Inhalt wird auf die LayeredPane gepackt
        layeredPane.add(panelOne, layerOne);       

        //JPanel mit dem Hintergrund wird auf die ContentPane gepackt
        add(background);
	}

}
Klasse um ein Bild auf einem JPanel darzustellen

Code:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class Picture extends JPanel {
    
	Image img;
	int width;
	int height;
	
    public Picture(String imageName, int width, int height) {
    	img = Toolkit.getDefaultToolkit().getImage(imageName);
    	this.width = width;
    	this.height = height;
    }
    
    public void paintComponent(Graphics g) {
    	super.paintComponent(g);
    	g.drawImage(img, 0, 0, this);
    }
}
Eine Klasse, mit weiterem Inhalt

Code:
import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

public class Field extends JPanel {    

    public Field() {
        setBackground(Color.BLACK);
    }
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.GREEN);
        g.fillRect(100, 100, 500, 25);        
    }
    
}
 
Zuletzt bearbeitet:

javaianer

Mitglied
Hier nochmal das ganze aber halt mit Sachen aus dem Konstruktor in eigener Methode.


Test-Klasse
Code:
public class TestWindow {

	public TestWindow() {
	}

	public static void main(String[] args) {
		//JFrame wird erst zum Schluß sichtbar gemacht!
		new MainWindow().setVisible(true);

	}

}

Hauptfenster-Klasse

Code:
import javax.swing.JFrame;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;

public class MainWindow extends JFrame {

	public MainWindow() {
		super("Endlich Hintergrund mit Inhalt");
		setSize(1024, 768);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		createContext();
	}
	
	void createContext() {
        Integer layerOne = JLayeredPane.FRAME_CONTENT_LAYER + 1; //Kann mir jemand dieses + 1 erklären?
        //Für weitere Layer (Ebenen)
        //Integer layerTwo = layerOne + 1; 

	JPanel background = new Picture("Hintergrund.JPG", 1024, 768);
    	background.setBounds(0, 0, 1024, 768);
	
    	JPanel panelOne = new Field();
    	//Position dieses Panels
    	panelOne.setBounds(358, 76, 651, 651);
   
    	JLayeredPane layeredPane = getLayeredPane();
    	//JPanel mit Inhalt wird auf die LayeredPane gepackt
    	layeredPane.add(panelOne, layerOne);       

    	//JPanel mit dem Hintergrund wird auf die ContentPane gepackt
    	add(background);
	}
}

Klasse um ein Bild auf einem JPanel darzustellen

Code:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import javax.swing.JPanel;

public class Picture extends JPanel {
    
	Image img;
	int width;
	int height;
	
    public Picture(String imageName, int width, int height) {
    	img = Toolkit.getDefaultToolkit().getImage(imageName);
    	this.width = width;
    	this.height = height;
    }
    
    public void paintComponent(Graphics g) {
    	super.paintComponent(g);
    	g.drawImage(img, 0, 0, this);
    }
}

Eine Klasse, mit weiterem Inhalt

Code:
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JPanel;

public class Field extends JPanel {    

    public Field() {
        setBackground(Color.BLACK);
    }
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.GREEN);
        g.fillRect(100, 100, 500, 25);        
    }
    
}
 
Zuletzt bearbeitet:

André Uhres

Top Contributor
Auf jede JComponent kann man sowohl malen als auch Kindkomponenten hinzufügen. Ein "ImageIcon" enthält ein Image, daher der Name. Dargestellt wird aber nur das Image. Optisch gesehen besteht darum kein Unterschied zwischen ImageIcon und Image. Der einzige Unterschied liegt in der für den Betrachter unsichtbaren programmiertechnischen Schnittstelle. Die "ContentPane" ist eine von vielen möglichen Ebenen im LayeredPane. Sie liegt innerhalb der LayeredPane in der sogenannten "FRAME_CONTENT_LAYER". "layerOne" liegt also eine Ebene höher über der ContentPane. Um mehrere JPanels aufeinanderzulegen kann man das LayeredPane benutzen, aber natürlich auch die normale Containerhierarchie (wenn wir eine Kindkomponente hinzufügen, liegt sie naturgemäss über der Mutterkomponente). Mit dem "BackgroundPanel" aus obigem Link können wir Bilder skaliert, "tiled" oder in Originalgrösse malen, sowie einen nuancierten Hintergrund mit einem Paint Objekt. Jede Komponente, die zu diesem Panel hinzugefügt wird, kann, wenn man will, automatisch durchsichtig gemacht werden, damit unsere "Malerei" durchscheinen kann. Die Schnittstelle von "BackgroundPanel" schliesst folgende Methoden ein:
public void setImage(Image image)
public void setStyle(int style) (skaliert, "tiled" oder in Originalgrösse)
public void setPaint(Paint painter)
public void setImageAlignmentX(float alignmentX)
public void setImageAlignmentY(float alignmentY)
public void setTransparentAdd(boolean isTransparentAdd)
 

André Uhres

Top Contributor
Um mehrere JPanels aufeinanderzulegen kann man ...
übrigens auch die Methode setComponentZOrder der Klasse Container benutzen, denn jede JComponent ist ein Container. Die Z-Order (dritte Dimension) bestimmt die Reihenfolge in der die Komponenten gemalt werden; die Komponente mit der höchsten Z-Order wird zuerst gemalt und die Komponente mit der niedrigsten Z-Order wird zuletzt gemalt. Wo Komponenten überlappen, wird die Komponente mit der niedrigeren Z-Order vor die Komponente mit der höheren Z-Order gemalt.
 

André Uhres

Top Contributor
Ich arbeite selten mit LayeredPane. Wenn man's mit der normalen Containerhierarchie und normalen LayoutManagern hinbekommt, ist das imho vorzuziehen.
 

javaianer

Mitglied
Ich arbeite selten mit LayeredPane. Wenn man's mit der normalen Containerhierarchie und normalen LayoutManagern hinbekommt, ist das imho vorzuziehen.

Mit normaler Containerhierarchie meinst du das mit "setComponentZOrder" (ein paar Antworten von dir vorher)?

So dann mal ganz speziell so wie es aussieht. brauch ich eine Ebene für den Hintergrund alles weitere kann auf die Ebene darüber, sprich mehr Überlappungen gibt es nicht.

Und vielen dank!
 

André Uhres

Top Contributor
Mit "setComponentZOrder" können wir die Komponenten einer einzigen Ebene, (d.h. die alle demselben Container hinzugefügt wurden), in einer bestimmten Reihenfolge zeichnen, wodurch alle möglichen Überlappungen realisierbar sind. Eine Containerhierarchie wird durch das einfache Hinzufügen von Komponenten auf verschiedenen Ebenen aufgebaut:
a.add(b);// b ist eine Ebene unter a
b.add(c);// c ist zwei Ebenen unter a
...
Die unterste Ebene wird zuletzt gemalt, ist also für den Betrachter "oben". Wir können z.B. dem Bildpanel einfach ein anderes Panel hinzufügen.
 

javaianer

Mitglied
Nach dem was ich gelesen habe und was ich getestet habe, geht setComponentOrderZ nur mit Componenten, aber nicht mit Container. Hierfür gibt es nur JLayeredPane.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W 2 JTables in einem Swing-Fenster? AWT, Swing, JavaFX & SWT 5
S Swing Fenster State Machine AWT, Swing, JavaFX & SWT 1
M Swing Warum öffnen sich beim Zeichnen mit Swing plötzlich zwei Fenster? AWT, Swing, JavaFX & SWT 5
G Swing zeichnet zweites Fenster nicht AWT, Swing, JavaFX & SWT 3
I swing fenster neu zeichnen, wenn überdeckt AWT, Swing, JavaFX & SWT 8
L Swing Fenster aktivieren AWT, Swing, JavaFX & SWT 2
S Swing Problem mit Swing - Fenster friert manchmal ein. AWT, Swing, JavaFX & SWT 7
Semox Swing Klausur: Swing Fenster nicht richtig dimensioniert AWT, Swing, JavaFX & SWT 2
H Swing und endlich Transparente Fenster! AWT, Swing, JavaFX & SWT 3
P Swing mit substance look/feel fenster repaint AWT, Swing, JavaFX & SWT 7
M Swing Applikation mit Fenster "inside" AWT, Swing, JavaFX & SWT 2
F Fenster im Fenster wie mit SWING umsetzen? AWT, Swing, JavaFX & SWT 2
E Swing-Fenster als Objekte im Sinne des OO-Prgrammparadigmas AWT, Swing, JavaFX & SWT 2
S Swing Element für Explorer-Fenster darstellung AWT, Swing, JavaFX & SWT 13
R SWING: Modales Fenster - Hauptfenster aktualisieren AWT, Swing, JavaFX & SWT 11
A Dispose und Swing-Fenster AWT, Swing, JavaFX & SWT 3
D JLabel o.a. im Swing Fenster löschen um neue JL. zu zeigen AWT, Swing, JavaFX & SWT 4
V Swing - minimiertes Fenster öffnen AWT, Swing, JavaFX & SWT 3
A Mehrere Fenster mit Swing AWT, Swing, JavaFX & SWT 7
N nur graues Fenster mit Swing AWT, Swing, JavaFX & SWT 16
J 3D-Animationen in Swing-Fenster AWT, Swing, JavaFX & SWT 2
XWing Jave swing overly benutzten. AWT, Swing, JavaFX & SWT 3
J Anzeige ID und Markierung für Knoten in Eclipse & Swing AWT, Swing, JavaFX & SWT 4
Juelin javax.swing in javafx AWT, Swing, JavaFX & SWT 1
A Eclipse 2023 und Swing AWT, Swing, JavaFX & SWT 4
H Swing Componente zur Läufzeit ändern AWT, Swing, JavaFX & SWT 3
B Actionlistener mit Java Swing AWT, Swing, JavaFX & SWT 2
W Gibt es einen "automatischen Listener" in Swing oder JTable oder der ATM-Klasse? AWT, Swing, JavaFX & SWT 14
H Swing Buttons erst nach Klick sichtbar AWT, Swing, JavaFX & SWT 13
ExceptionOfExpectation Anpassung von JKomponentengrößen (Swing) AWT, Swing, JavaFX & SWT 3
thor_norsk AWT SWING Aufgabe AWT, Swing, JavaFX & SWT 7
U Zwei Fragen zu eienr Swing Aufgabe AWT, Swing, JavaFX & SWT 2
M Swing Bilder in Swing anzeigen AWT, Swing, JavaFX & SWT 9
H Swing , GridLayout, Größenbestimmung der Komponenten im Layout AWT, Swing, JavaFX & SWT 8
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
Guybrush Threepwood Einfachste Möglichkeit zum Abspielen eines Videos in Swing AWT, Swing, JavaFX & SWT 4
A Swing ProgressBar über 2 parallel laufende Threads AWT, Swing, JavaFX & SWT 2
M Swing GridLayout AWT, Swing, JavaFX & SWT 2
O return-Statement mit Swing AWT, Swing, JavaFX & SWT 6
O Ein Java-Programm mit Swing steuern AWT, Swing, JavaFX & SWT 1
Monokuma Swing zu JavaFX AWT, Swing, JavaFX & SWT 5
J Swing Slider AWT, Swing, JavaFX & SWT 11
G Thread starten Swing AWT, Swing, JavaFX & SWT 5
G Swing JPasswordField AWT, Swing, JavaFX & SWT 12
L Swing Button Farbe ändern/wechseln AWT, Swing, JavaFX & SWT 2
C Swing AWT GUI Anfänger Aufgabe AWT, Swing, JavaFX & SWT 7
W Inject bei einem Swing Frontend AWT, Swing, JavaFX & SWT 8
L Kommunikation zwischen Klassen / Konstruktoren bei Swing AWT, Swing, JavaFX & SWT 9
M Feldvalidierung swing AWT, Swing, JavaFX & SWT 4
E Swing Componenten werden nach Änderung des display modes verzerrt dargestellt AWT, Swing, JavaFX & SWT 8
D [Swing] Anordnung von Komponenten mit GridLayout Manager AWT, Swing, JavaFX & SWT 13
O Zukunft von Swing und JavaFX ? AWT, Swing, JavaFX & SWT 3
T Swing Swing an Bildschirm anpassen AWT, Swing, JavaFX & SWT 3
S Swing Panel wird nicht neu gezeichnet AWT, Swing, JavaFX & SWT 3
M Swing Java Swing/AWT Combobox Bug AWT, Swing, JavaFX & SWT 3
M Swing GUI mittels erben sowie variabler Dateninhalt AWT, Swing, JavaFX & SWT 1
W Swing Multitouch mit Swing AWT, Swing, JavaFX & SWT 6
S Swing-Applikation die ein Numpad nachbildet samt Keybindings..? AWT, Swing, JavaFX & SWT 5
S Swing Java Swing AWT, Swing, JavaFX & SWT 6
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
J Swing oder JavaFX AWT, Swing, JavaFX & SWT 21
D Swing Anwendung ohne JPanel erstellen AWT, Swing, JavaFX & SWT 1
D SQL Statements mit Java Swing benutzen AWT, Swing, JavaFX & SWT 4
Damtonix BufferStrategy flackert (Swing) AWT, Swing, JavaFX & SWT 9
D DatePicker für Java Swing AWT, Swing, JavaFX & SWT 2
B JavaFX oder swing AWT, Swing, JavaFX & SWT 3
T Java Swing - kleines Rechteck unter dem cursor AWT, Swing, JavaFX & SWT 5
L 2D-Grafik Swing paint|paintComponent AWT, Swing, JavaFX & SWT 2
L Swing Größe automatisch anpassen AWT, Swing, JavaFX & SWT 14
G Swing Swing Binding JList funktioniert nicht AWT, Swing, JavaFX & SWT 5
Blender3D Meine Swing Anwendung läuft unter Windows 10 und Ubuntu aber nicht auf Windows 7 AWT, Swing, JavaFX & SWT 16
B Bar Plot in Swing JPanel AWT, Swing, JavaFX & SWT 0
D Swing in Kombination mit JGraphX und JGraphT AWT, Swing, JavaFX & SWT 0
F main-Funktion bei Swing AWT, Swing, JavaFX & SWT 4
S Java Swing Print() method AWT, Swing, JavaFX & SWT 4
S Java Swing auf Windows Phone AWT, Swing, JavaFX & SWT 6
I JAVAFX - Übergabe der Inhalte an eine Scene - Wo ist der Vorteil gegenüber Swing? AWT, Swing, JavaFX & SWT 2
S Manuelles Menu in Swing AWT, Swing, JavaFX & SWT 3
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
MaxG. Swing Swing Komponenten zur Laufzeit hinzufügen AWT, Swing, JavaFX & SWT 2
Java_RY Bin Ratlos bzgl Malen in Swing AWT, Swing, JavaFX & SWT 5
offi Swing Shuttle List AWT, Swing, JavaFX & SWT 9
I Graph mit Swing zeichnen AWT, Swing, JavaFX & SWT 8
D Swing Swing Objekte sehen im Entwurf anders aus als beim Ausführen AWT, Swing, JavaFX & SWT 3
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
javampir Swing repaint in JavaFX Anwendung AWT, Swing, JavaFX & SWT 3
K Mit JavaFX angefangen. Lohnt sich Swing? AWT, Swing, JavaFX & SWT 28
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
B Swing Tabelle(JTable) filtern swing GUI AWT, Swing, JavaFX & SWT 3
M Swing Swing-Widgets und paintComponent() AWT, Swing, JavaFX & SWT 2
B Swing WindowBuilde: Menu -> anderes Panel wechseln AWT, Swing, JavaFX & SWT 1
K eigener button in swing AWT, Swing, JavaFX & SWT 3
A JavaFX DatePicker in Swing beim Start nicht sichtbar AWT, Swing, JavaFX & SWT 2
windl Bufferstrategy in Swing nachstellen AWT, Swing, JavaFX & SWT 0
M Kamera in Java Swing einbinden AWT, Swing, JavaFX & SWT 4
Z Swing Swing und die Progressbar AWT, Swing, JavaFX & SWT 1
J Frage zur objektorentierten Swing Programmierung AWT, Swing, JavaFX & SWT 10
Xanny 2D-Grafik Beginner! Probleme mit Swing, Gprahics class und paint AWT, Swing, JavaFX & SWT 13
F Java Swing Rechteck in JPanel zeichnen AWT, Swing, JavaFX & SWT 7
N Swing Benötige Hilfe um ein Swing Canvas zu speichern AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben