Screen Overlay

Ich würde gerne ein Overlay haben, auf das ich Text darstellen lassen kann. D.h. egal welches Programm offen ist ( Bei den meisten geht es nur wenn das Programm mindestens im Vollbildfenster-Modus ist), ich möchte auf dem Bildschirm Text darstellen lassen. Ich habe das so realisiert, wie in der Overlay Klasse. Jetzt kann ich dem Frame Labels hinzufügen und Text darstellen lassen.

Problem1: Ich muss mehrfals auf das Taskbar Icon klicken, damit sich das Fenster auch wirklich nach vorne “schiebt”, meistens sogar mehrfach. ( Vllt muss das JFrame maximiert starten )

Problem2: Ich möchte das Overlay ein und ausblenden können, aber wenn das Frame invisible ist, kann es natürlich keinen Focus mehr erlangen also habe ich sowas gefunden. Aber das funktioniert auch nichtmehr sobald das JFrame einmal invisible ist. ( Er erkennt keine KeyEvents mehr ) Mit dem new Overlay(), geht es aber dann erstellt er immer ein leeres Fenster, was sich besonders in der TaskListe zeigt und sehr unsauber ist meiner Meinung nach.

EDIT: Lösung zu Problem 2 ( Adding “Global” KeyListener - Blogs - Java Programming Forum - Learn Java Programming )

Vielen Dank für eure Hilfe !

		KeyboardFocusManager.getCurrentKeyboardFocusManager().addKeyEventDispatcher(new KeyEventDispatcher() {
			@Override
			public boolean dispatchKeyEvent(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_NUMPAD0 && e.getID() == KeyEvent.KEY_PRESSED) {
					if (overlay.isVisible()) {
						System.out.println("Y");
						overlay.setVisible(false);
						// new Overlay();
					} else {
						System.out.println("X");
						overlay.setVisible(true);
					}
				}
				return false;
			}
		});
	}```

```package visual;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;

import javax.swing.JFrame;
import javax.swing.WindowConstants;

public class Overlay extends JFrame {

	// https://github.com/The-Nutty/CSGo-In-game-Bomb-Timer/blob/master/src/com/tomhazell/csgo/ingametimer/Overlay.java

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	public Overlay() {

		Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
		Double width = screenSize.getWidth();
		Double height = screenSize.getHeight();

		this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
		this.setUndecorated(true);
		this.setBackground(new Color(0, 0, 0, 0));
		this.setSize(width.intValue(), height.intValue());
		this.setPreferredSize(new Dimension(width.intValue(), height.intValue()));
		this.getRootPane().putClientProperty("apple.awt.draggableWindowBackground", false);
		this.setLayout(null);
		this.setAlwaysOnTop(true);
		this.setVisible(true);
	}

}

ein Dummy-Inhalt wie bei mir testweise

    public void paint(Graphics g)
    {
        super.paint(g);
        
        g.setColor(Color.RED);
        g.drawString("Hallo", 30, 40);
        g.fillRect(100,  200,20, 50);
    }

wäre gut gleich mit zu posten, sonst ist es ja so weitgehend unsichtbar, schlecht zu testen ob es wirklich zu sehen ist oder nicht…,
höchstens mit Markierungsbalken wenn selber ausgewählt,
spätestens bei anderen Fenster ausgewählt unklar ob das unsichtbare nun vorne liegt oder nicht…,

bei mir funktioniert es anscheinend im Moment:
Programm starten (aus Eclipse), und es ist sofort maximiert sichtbar vorne liegend,
andere Programme können normal ausgewählt und bedient werden wobei das Overlay sichtbar bleibt,
auch weitere neu gestartete Programme (zumindest Explorer, PDF-Datei, Browser) verdecken es nicht

interessante Möglichkeit mit wenig Code, müsste ich in meine Liste Java-Links einfügen, wenn ich nur eine gut gepflegt hätte :wink:


bei dir ist das Java-Programm nach Start nicht direkt sichtbar oder schon sichtbar, aber bei Wechsel auf andere Programme schieben sich diese wieder davor?
beschreibe es doch ruhig ganz genau

falls das Problem ist, dass nach Start nicht direkt sichtbar:
wie verhält es sich denn mit normalen anderen JFrame-Programmen bei dir, da klappt dieses Standardverhalten doch wohl hoffentlich?
evtl. zu testen an welchen neuen Befehlen es liegt dass dies nicht mehr klappt,

ne Lösung wüsste ich sicher nicht, aber wäre eine Info, ab welcher Änderung es zum Problem kommt

Ich lese da “apple.awt.draggableWindowBackground” - ist das richtig?

Suchmaschinenaufruf würde es selber klären :wink:

Stimmt, da hast du Recht.
Da findet sich sowas wie https://developer.apple.com/library/mac/technotes/tn2007/tn2196.html
Hat Apple mal an Java mitgewerkelt? Wusste ich gar nicht.

was denkst, du woher der Name Java-Applet – Wikipedia kommt? :wink:
so, genug der Neben-Scherze