Components überlagern

Status
Nicht offen für weitere Antworten.

peez

Bekanntes Mitglied
Ich schreibe gerade ein Programm, in dem mit JMF ein Video abgespielt wird. Darüber soll ein BufferedImage mit einem Text überlagert werden.
Wie könnte ich das hinbekommen?

Wenn ich jetzt einfach dem Frame, wo der Component mit dem Video drin ist, noch einen Component hinzufüge, in dem das BufferedImage gezeichnet wird (welches abgesehen von der Schrift transparent ist), wird der Hintergrund des neues Components in füllend weiß statt transparent dargestellt und das Video dahinter komplett überlagert.

Geht das so wie ich es vor habe?
 
Yo, ist ganz einfach: Du leitest von JPanel ab, übergibst dem das Bild im Constructor, überschreibst die paintComponent() Methode, und zeichnet dort das Bild. Wenn du diesem Panel etwas hinzufügst, wird das über das Bild gemalt.

Es gibt auch eine SwingX-Komponente, die das von sich aus kann, siehe http://swinglabs.org/downloads.jsp
 
Achso ich sollte vielleicht sagen, dass es in AWT oder zur Not in SWT passieren muss. Das Videobild ist ein embedded AWT Frame in eine SWT GUI.
 
Niemand eine Idee?


So (vereinfacht) wird die GUI aufgebaut

Code:
Composite playerComposite = new Composite(m_shell, SWT.EMBEDDED);
mediaPlayer = Manager.createRealizedPlayer( url );
videoFrame = SWT_AWT.new_Frame( playerComposite );
videoComponent = m_mediaPlayer.getVisualComponent();
videoFrame.add( m_videoComponent );


Jetzt muss ich entweder ein SWT Composite über playerComposite legen, oder einen Component über videoComponent. Ist es überhaupt möglich, ein Component oder Composite transparent zu machen?
 
hier vielleicht hilft es dir

Code:
package test;

import java.awt.AlphaComposite;
import java.awt.Composite;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Panel;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class TestFrame extends Frame {

	public TestFrame() {
		super("Transparent");
		setSize(300, 300);
		BufferedImage image;
		try {
			image = ImageIO.read(new File("lib/bild.jpg"));
			add(new ImagePanel(image, true));
		} catch (IOException e) {
			e.printStackTrace();

		}
		
		setVisible(true);
	}

	public class ImagePanel extends Panel {
		private BufferedImage image;
		private boolean transparent;

		public ImagePanel(BufferedImage bufferedImage) {
			this(bufferedImage, true);
		}

		public ImagePanel(BufferedImage bufferedImage, boolean transparent) {
			this.transparent = transparent;
			image = bufferedImage;
		}

		public void paint(Graphics g) {
			super.paint(g);
			Graphics2D graphics2D = (Graphics2D) g;
			Composite old = graphics2D.getComposite();
			if (transparent) {
				graphics2D.setComposite(AlphaComposite.getInstance(
						AlphaComposite.SRC_OVER, 0.4f));
			}
			graphics2D.drawImage(image, 0, 0, getSize().width,
					getSize().height, null);
			if (transparent) {
				graphics2D.setComposite(old);
			}

		}
	}

	public static void main(String[] args) {
		new TestFrame();
	}

}
 
Hmm ja das glaube ich so langsam auch ;-)
Die Lösung von SirWayne funktioniert leider nur innerhalb eines Components und nicht für zwei übereinander liegende.

Bin schon am überlegen, das anders zu machen also z.B. den PlayerComponent ohne getVisualComponent() aufzubauen und dann bei jedem Frame das entsprechende Bild im Voraus reinzeichnen... Da bin ich aber ähnlich ratlos wie hier. Im Netz gibts viele ziemlich aufwändige Beispiele mit Processor, Codecs etc.
Wüsste da jemand ein schnelles Tutorial o.ä.?
 
GlassPane wäre wieder Swing. Und da meine GUI SWT ist, kann ich leider nur SWT oder AWT Komponenten benutzen.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben