Swing Info-Ebene überdeckt Spielfeld-Ebene komplett

Curry

Aktives Mitglied
Moin Moin!

Ich möchte eine Info-Ebene (z.B. ein JPanel) über eine Spielfeld-Ebene (ist von JPanel abgeleitet) legen. Das übereinander Legen funktioniert sogar. Dazu verwende ich das CardLayout. Jedoch bekomme ich die Info-Ebene nicht transparent. Es sollten lediglich die Informationen (z.B. Schrift oder Animationen) die Elemente der Spielfeld-Ebene überschreiben. Hat jmd. eine Idee wie ich das hinbekomme?

Wenn man die Zeilen 31 bis 33 auskommentiert, dann wird das Spiel ordentlich angezeigt.

Diesem Posting habe ich auch den kompletten Code des Programms (Pong.zip) angehängt.

Ich würde mich sehr über eure Hilfe freuen!

Hier der Code des JFrame's:
Java:
public class MyFrame extends JFrame implements WindowListener, KeyListener {

	private PongField field;
	private InfoPanel info;

	final static String CARD_FIELD		= "Field";
	final static String CARD_INFO		= "Info";

	public MyFrame(String title) {
		super(title);

		this.addWindowListener(this);
		this.addKeyListener(this);

		ScoreboardModel score = new ScoreboardModel();
		

		Container cp = getContentPane();
		cp.setLayout(new GridBagLayout());
		GridBagConstraints gbc = new GridBagConstraints();

		Scoreboard scoreboard = new Scoreboard(score);
		gbc.gridy = 0;
		gbc.gridx = 0;
		add(scoreboard, gbc);

		JPanel cards = new JPanel();
		cards.setLayout(new CardLayout());
//		cards.setPreferredSize(new Dimension(500, 300));

			info = new InfoPanel();
			cards.add(info, CARD_INFO);
			info.start();

			field = new PongField(score);
			cards.add(field, CARD_FIELD);

		gbc.gridy = 1;
		gbc.gridx = 0;
		add(cards, gbc);

		pack();
		centerFrame();
		setResizable(false);
	}

	public void centerFrame() {
		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		Dimension frameSize = this.getSize();

		if (frameSize.height > screenSize.height) {
			frameSize.height = screenSize.height;
		}
		if (frameSize.width > screenSize.width) {
			frameSize.width = screenSize.width;
		}

		this.setLocation(
			(screenSize.width - frameSize.width) / 2,
			(screenSize.height - frameSize.height) / 2
		);
	}

	// #####################################
	// Interface: WindowListener
	// #####################################
	public void windowActivated(WindowEvent event) {}

	public void windowClosed(WindowEvent event) {}

	public void windowClosing(WindowEvent event) {
		event.getWindow().setVisible(false);
		event.getWindow().dispose();
		System.out.println("Programm wurde geschlossen");
		System.exit(0);
	}

	public void windowDeactivated(WindowEvent event) {}

	public void windowDeiconified(WindowEvent event) {}

	public void windowIconified(WindowEvent event) {}

	public void windowOpened(WindowEvent event) {}

	// #################################
	// Interface: KeyListener
	// #################################
	public void keyPressed(KeyEvent event) {
		field.keyPressed(event);
	}

	public void keyReleased(KeyEvent event) {
		field.keyReleased(event);
	}

	public void keyTyped(KeyEvent event) {
	}
}

Und hier der der Info-Ebene:
Java:
public class InfoPanel extends JComponent implements Runnable {

	Thread thread;

	int x = 50;

	public InfoPanel() {
//		this.setBackground(Color.BLUE);
//		this.setOpaque(false);
		this.thread = new Thread(this);
	}

	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);

		g.drawString("nervige Test-Information", x, 100);
	}

	public void start() {
		thread.start();
	}

	public void run () {
		while(true) {
			repaint();
			if(x < 300) {
				x++;
			}
			else {
				x = 50;
			}

			try {
				Thread.sleep(20);
			}
			catch(InterruptedException exception) {
			}
		}
	}

}
 

Anhänge

Das CardLayout legt m.W. keine Komponenten übereinander. Es ist dafür gedacht Komponten dynamisch zur Laufzeit gegen andere auszutauschen.
Zum Stapeln von Komponenten könnte man z.B. JLayeredPane verwenden.
 
Oder Du nimmst gar keine Swing-Komponente, sondern bastelst Dir was eigenes, was sich selbst über das Graphics-Objekt Deines Spiels zeichnet.
 
Mit dem GlassPane habe ich es hinbekommen! Vielen Dank für den Tipp!

Etwas Eigenes basteln klingt aber auch sehr spannend und da es mir gerade primär um das Lernen geht würde ich das gerne mal ausprobieren, nur habe ich keine Idee wie ich da beginne. Brauche ich zum Zeichnen nicht immer irgendeine paint() oder paintComponent() einer GUI-Komponente? Würde mich sehr über Tipps, z.B. auch Links zu Tutorials, freuen!
 

Zurück
Oben