Prüfen, ob eine Anwendung im Vordergrund ist?

vfl_freak

Premium-User
Guten Morgen,

meine Anwendung wird in ganz bestimmten Konstellationen mit "toFront()" in den Vordergrund geholt, egal, welche Windows-Fenster sonst noch offen sind.
Leider funktioniert dies nur einwandfrei, wenn ich die Anwendung zuvor einmal minimiere und dann maximiere mit
Code:
setExtendedState(Frame.ICONIFIED);
setExtendedState(Frame.MAXIMIZED_BOTH);
toFront();

Da dies aber nun zu einem unschönen Flackern führt, wenn die Anwendung in diesem Moment bereits im Vordergrund ist, möchte ich diesen entsprechenden Status gerne prüfen!

Nur - wie mache ich? Aufrufe wie "isVisible" etc. bringen leider nicht den gewünschten Erfolg!

Muss ich dazu auf das Windows-API zugreifen? Und wenn ja - wie?

Gruß
Klaus
 
Zuletzt bearbeitet:
Java:
package core;

import javax.swing.JFrame;

public class Main extends JFrame
{
	private static final long serialVersionUID = 1L;

	public Main()
	{
		super();
	}
	public void testFocus()
	{
		while(true)
			if(this.hasFocus())
				System.out.println("True");
			else
				try
				{
					Thread.sleep(10L);
				}
				catch(Throwable e)
				{
					e.printStackTrace();
				}
	}
	public static void main(String[] args)
	{
		Main m = new Main();
		m.setSize(400, 400);
		m.setResizable(false);
		m.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		m.setVisible(true);
		m.testFocus();
	}
}
 
Hallo Kai,

erstmal Danke - das ist ein sehr interessanter Ansatz, den ich gleich austesten werde :)

Da ich mit Java leider noch nicht ganz firm bin, eine kurze Frage hierzu!
Ist mit dem erwähnten Thread in der Fkt. "testFocus" quasi die "EventQueue" gemeint oder ist das wirklich nur ein hier lokal laufender Thread, der die Schleife leicht abbremsen soll

Danke und Gruß
Klaus
 
Hmm wenn du den Setter gefunden hast, hättest du auch den Getter finden können. Es gibt auch ein getExtendedState.
 
Hallo Kai,

erstmal ein großes Dankeschön - Du hast mich genau auf die richtige Spur gebracht ... :p

Hier meine Lösung für die Nachwelt :-), die ich so an allen drei relevanten Stellen aufrufe (übrigens ohne Thread, das ganze schon in einem Timer läuft!) :
Java:
if( !this.isFocusOwner() )
{
    setVisible( true );
    setExtendedState(Frame.ICONIFIED);
    setExtendedState(Frame.MAXIMIZED_BOTH);
    toFront();
}

Noch ein Hinweis hierzu am Rande:
Die Methode "hasFocus()" ist laut Java inzwischen obsolet und durch "isFocusOwner()" ersetzt worden!

Danke und Gruß
Klaus
 
Zuletzt bearbeitet:
Hmm wenn du den Setter gefunden hast, hättest du auch den Getter finden können. Es gibt auch ein getExtendedState.

Moin zeja,
naja, "gefunden" nicht wirklich, sondern hier von einer anderen Stelle im Projekt übernommen Habe das Ganze vor ca. einem halben Jahr, als ein Kollege kündigte, auf's Auge gedrückt bekommen - ohne zu dem Zeitpunkt eine Spur Ahnung von Java ;-]. Komme zwar inzwischen ganz gut klar (und habe ich auch an die Unterschiede zu VS/C++ gewöhnt),aber manchmal hakt es dann leider doch noch ....

Aber zurück zum Thema:
verstehe ich das richtig, das ein "if( getExtendedState() == MAXIMIZED_BOTH )" hier in etwa den gleichen Effekt hätte, wie ein "isFocusOwner()" ? ?

Danke und Gruß
Klaus
 
Nein, denn dass ein Fenster maximiert ist, heißt ja noch nicht dass es den Focus hat und umgekehrt. Also wenn du nicht nur dein Fenster in den Vordergrund bringen willst, sondern es auch maximiert haben willst, dann müsstest du das entsprechend auch noch prüfen.

Im übrigen handelt es sich um eine Bitmask. Um also zu prüfen ob der Wert gesetzt ist musst du sowas machen:
Java:
(getExtendedState() & MAXIMIZED_BOTH) == 0
 
Hallo zeja,

Bitmask, stimmt - hatte auf die schnelle nur den Rückgabewert "int" gesehen :rolleyes:

Es geht hier hauptsächlich um das "in den Vorgrund bringen"! Im Programm werden 'Alarme' durch die von Bewegungsmeldern in Webcams erzeugten und angezeigten Bilder bearbeitet!
Es funktioniert so, wie ich es oben beschrieben habe prima - aber augenscheinlich auch nur so :mad:
Ohne das mini- und maximieren zeigt das "toFront" keine Wirkung und umgekehrt ..... :-(

tschüss
Klaus
 
Verstehe ich nicht. Wenn ich in der Methode oben

Java:
while(true)
{
	this.requestFocus();
	this.toFront();
}

statt dem anderen verwende bleibt es immer im Vordergrund. Eventuell könnte dir auch .setAlwaysOnTop(true);/false helfen, ersteres setzt das Fenster ebenfalls nach vorne, letzteres verhindert dass das dann so bleibt.
 
Zurück