Problem: Swing und Bitmaps im NullLayout

foodaggression

Grünschnabel
Tag zusammen,

ich habe folgendes Problem mit dem NullLayout: In meinem Program gibt es ein JPanel, in das ein Hintergrundbild gezeichnet werden muss. Dieses Bild (ein Schaltplan) soll an mehreren genau vordefinierten Stellen von Textfeldern und Buttons überlagert werden.

Die einfachste Vorgehensweise erschien mir ein NullLayout innerhalb dieses Panels, durch das die TextFields und Buttons genau an der Richtigen stelle platziert werden.
Das ganze Program funktioniert einwandfrei, solange innerhalb dieses Panels nicht JTextFields sondern alte TextFields benutzt werden.

Verwendet man ein JTextField, wird es nicht angezeigt.
Deaktiviert man das Hintergrundbild, sieht man, dass das JTextField angezeigt wird, aber wohl von dem Bild überlagert wird.

Das gleiche gild für alle Swingelement, ersichtlich auch daran, dass zwar eine MenuBar einwandfrei funktioniert, aber eine JMenuBar das Bild nicht überlagern kann. (Klickt man auf "Datei", wird das herabfallende Menu nur bis zum Bild angezeigt und verschwindet dann).

Wie zwingt man Swingelemente in den Vordergrund/das Bild in den Hintergrund, ohne auf das NullLayout verzichten zu müssen?

zum anzeigen des Bildes verwende ich folgende Klasse:

Code:
class BitmapComponent
extends Canvas{

private Image img;

public BitmapComponent(String fname){
	
    img = getToolkit().getImage(fname);
    MediaTracker mt = new MediaTracker(this);

    mt.addImage(img, 0);
    try {
      mt.waitForAll();
      
    } catch (InterruptedException e) {}
  }

public void paint(Graphics g){
	
    g.drawImage(img,1,1,this);
 }
}

Danke im Vorraus!
 
Unabhängig davon, dass ich NullLayout überhaupt nicht empfehlen kann, würde ich für Überlagerungen und Überlappungen mit JLayeredPane arbeiten.
 
OK, vielen Dank!
Der Tipp mit der JLayeredPane war klasse, er hat nur nicht mit der von mir oben geposteten Klasse funktioniert (deshalb hat es etwas gedauert). Ein durch diese Klasse gezeichnetes Bild überlagert einfach alle JComponents, egal in welche Layer man es packt.

Jetzt hab ich mein Hintergrundbild einfach in ein JLabel gepackt und jetzt siehts so aus, wies aussehen soll.


PS: Ich bin mir der Unzulänglichkeiten des Null-Layouts völlig bewust. Aber an dieser Stelle ist es einfach nötig, ein GridBagLayout mit hunderten Grids macht einfach noch weniger Sinn....

Edit:
Das Thema ist ja beendet, wie markiere ich es als "reif fürs Archiev" / "Frage beantwortet"?
 
Zuletzt bearbeitet:
Hallo,

schau mal hier:
Java:
import java.awt.*;

import javax.swing.*;

public class PaintExample extends JFrame {

	public PaintExample() {
		super("Schaltplan");
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		BitmapComponent panel = new BitmapComponent("schaltplan.gif");
		panel.setPreferredSize(new Dimension(300, 300));
		panel.setLayout(null);
		panel.setBorder(BorderFactory.createRaisedBevelBorder());

		JLabel l = new JLabel("Label");
		JButton b = new JButton("Button");
		JTextField t = new JTextField("Textfeld");

		l.setBounds(30, 30, 100, 30);
		b.setBounds(120, 120, 100, 30);
		t.setBounds(220, 220, 100, 30);

		panel.add(l);
		panel.add(b);
		panel.add(t);

		BitmapComponent panel2 = new BitmapComponent("schaltplan.gif");
		panel2.setPreferredSize(new Dimension(300, 300));
		panel2.setBorder(BorderFactory.createLoweredBevelBorder());

		JLabel l2 = new JLabel("Label");
		JButton b2 = new JButton("Button");
		JTextField t2 = new JTextField("Textfeld");

		panel2.add(l2);
		panel2.add(b2);
		panel2.add(t2);

		this.add(panel, BorderLayout.NORTH);
		this.add(panel2, BorderLayout.SOUTH);

		this.pack();
		this.setVisible(true);
	}

	public static void main(String[] args) {
		PaintExample l = new PaintExample();
	}

	class BitmapComponent extends JPanel {

		private Image img;

		public BitmapComponent(String fname) {

			img = getToolkit().getImage(fname);
			MediaTracker mt = new MediaTracker(this);

			mt.addImage(img, 0);
			try {
				mt.waitForAll();

			} catch (InterruptedException e) {
			}
		}

		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.drawImage(img, 1, 1, this.getWidth(), this.getHeight(), this);
		}
	}
}

Vg Erdal
 
Zurück