Discussion:
Frame im Vordergrund halten
(zu alt für eine Antwort)
Canken K.
2004-05-27 09:35:38 UTC
Permalink
Hallo,

ich habe eine kleine Anwendung geschrieben, die
immer im Vordergrund bleiben soll.

Hat man unter java diese Möglichkeit ?

Danke
Jan Kassens
2004-05-27 12:54:30 UTC
Permalink
Post by Canken K.
Hallo,
ich habe eine kleine Anwendung geschrieben, die
immer im Vordergrund bleiben soll.
Hat man unter java diese Möglichkeit ?
Natürlich! Zum Beispiel kannst du mit SWT folgendermaßen ein Fenster
erzeugen, das immer "ON_TOP" ist:


import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class Main {
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(
display,
SWT.ON_TOP | SWT.TITLE | SWT.CLOSE
);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
Post by Canken K.
Danke
bitte

Jan Kassens
Andre Teubner
2004-05-27 13:12:10 UTC
Permalink
Post by Jan Kassens
Post by Canken K.
Hallo,
ich habe eine kleine Anwendung geschrieben, die
immer im Vordergrund bleiben soll.
Hat man unter java diese Möglichkeit ?
Natürlich! Zum Beispiel kannst du mit SWT folgendermaßen ein Fenster
[..]

IMHO meint er wohl ein Frame aus der JFC. Und da
es geht(IMO) ohne JNI nicht. Man kann da nicht mal
seine Fenster vernünftig aus dem Hintergrund vorholen.
Post by Jan Kassens
bitte
Jan Kassens
Gruss
Andre
Tobias Vogele
2004-05-27 13:25:00 UTC
Permalink
Hi,
Post by Andre Teubner
IMHO meint er wohl ein Frame aus der JFC. Und da
es geht(IMO) ohne JNI nicht. Man kann da nicht mal
seine Fenster vernünftig aus dem Hintergrund vorholen.
Sollte das nicht mit Window#toFront() gehen? Oder was meinst Du mit
"vernünftig"?

Grüße,

tobi
--
URL: http://www.wartmal.de Email: ***@wartmal.de
Andre Teubner
2004-05-27 13:49:16 UTC
Permalink
Hi,
Post by Tobias Vogele
Hi,
Post by Andre Teubner
IMHO meint er wohl ein Frame aus der JFC. Und da
es geht(IMO) ohne JNI nicht. Man kann da nicht mal
seine Fenster vernünftig aus dem Hintergrund vorholen.
Sollte das nicht mit Window#toFront() gehen?
Ja, die Bezeichnung der Methode könnte einen dazu verleiten dies zu
vermuten (in der API stehts ja auch so drin). Nur funktioniert dies (bei
mir-> Testrechner & Produktivumgebung) sehr sporadisch, insbesondere
wenn man vor dem Absenden des Events ein anderes Fenster in den
Vordergrund geholt hat.
Post by Tobias Vogele
Oder was meinst Du mit "vernünftig"?
Methodenaufruf-> Fenster vorne. Per JNI geht es echt ohne Probleme.
Post by Tobias Vogele
Grüße,
tobi
Gruss
Andre
Canken K.
2004-05-27 14:12:31 UTC
Permalink
Hallo,

ich habe Linux als OS und da hat es mit toFront()
geklappt.

Danke für die tollen Tips.
Andre Teubner
2004-05-27 14:30:53 UTC
Permalink
Post by Canken K.
Hallo,
ich habe Linux als OS und da hat es mit toFront()
geklappt.
Zufall... ;o)

Auszug aus der API:

[API]
...No action will take place if this Window is not visible...
[/API]

Ergo, wenn richtig im Hintergrund ist Schicht im Schacht.
Post by Canken K.
Danke für die tollen Tips.
Gruss
Andre
Tobias Vogele
2004-05-27 14:51:53 UTC
Permalink
Hallo,
Post by Andre Teubner
[API]
...No action will take place if this Window is not visible...
[/API]
Ergo, wenn richtig im Hintergrund ist Schicht im Schacht.
"not visible" würde ich so verstehen, daß das Fenster noch nicht mit
show() oder setVisible(true) geöffnet wurde bzw. bereits analog
geschlossen wurde.
Dann ist es aber eben geschlossen und nicht im Hintergrund. IHMO gibt es
kein "richtig" oder "falsch" im Hintergrund. Wenn toFront() manchmal
nicht funktioniert, obwohl das Fenster noch da ist (also etwa einen
Button in der Taskleiste hat), ist das IMO ein Bug.

Grüße,

tobi
--
URL: http://www.wartmal.de Email: ***@wartmal.de
Daniel Urban
2004-05-27 20:26:58 UTC
Permalink
Post by Tobias Vogele
Post by Andre Teubner
[API]
...No action will take place if this Window is not visible...
[/API]
Ergo, wenn richtig im Hintergrund ist Schicht im Schacht.
"not visible" würde ich so verstehen, daß das Fenster noch nicht mit
show() oder setVisible(true) geöffnet wurde bzw. bereits analog
geschlossen wurde.
Dann ist es aber eben geschlossen und nicht im Hintergrund. IHMO gibt es
kein "richtig" oder "falsch" im Hintergrund. Wenn toFront() manchmal
nicht funktioniert, obwohl das Fenster noch da ist (also etwa einen
Button in der Taskleiste hat), ist das IMO ein Bug.
Auzug aus der API (diesmal etwas mehr):

Places this Window at the top of the stacking order and shows it in front
of any other Windows in this VM. No action will take place if this Window is
not visible. Some platforms do not allow Windows which own other Windows to
appear on top of those owned Windows. Some platforms may not permit this VM
to place its Windows above windows of native applications, or Windows of
other VMs. This permission may depend on whether a Window in this VM is
already focused. Every attempt will be made to move this Window as high as
possible in the stacking order; however, developers should not assume that
this method will move this Window above all other windows in every
situation.

Insbesondere der letzte Satz läßt vermuten, daß es eben schon dazu kommen
kann, daß toFront() nicht funktioniert. Also ist toFront() kein
zuverlässiger weg.

Gruß,

Daniel
Tobias Vogele
2004-05-28 00:11:29 UTC
Permalink
Hallo,
Post by Tobias Vogele
Wenn toFront()
manchmal nicht funktioniert, obwohl das Fenster noch da ist (also
etwa einen Button in der Taskleiste hat), ist das IMO ein Bug.
[..]
however, developers should not assume that this method will move this
Window above all other windows in every situation.
Insbesondere der letzte Satz läßt vermuten, daß es eben schon dazu
kommen kann, daß toFront() nicht funktioniert. Also ist toFront() kein
zuverlässiger weg.
Ok, also ein dokumentierter Bug. :-)
Ich persönlich hab die Methode auch nur einmal vor Jahren benutzt und
kann mich nicht an Probleme erinnern. Aber wenn Andre schreibt, es
funktioniert nicht vernünftig, obwohl es per JNI problemlos geht, ist
das IHMO schon ein ein Problem der Implementierung dieser Funktion.
Offenbar hätte man es auch besser machen können.

Grüße,

tobi
--
URL: http://www.wartmal.de Email: ***@wartmal.de
Andre Teubner
2004-05-28 07:02:38 UTC
Permalink
Daniel Urban wrote:
[..}
Post by Daniel Urban
Places this Window at the top of the stacking order and shows it in front
of any other Windows in this VM. No action will take place if this Window is
not visible. Some platforms do not allow Windows which own other Windows to
appear on top of those owned Windows. Some platforms may not permit this VM
to place its Windows above windows of native applications, or Windows of
other VMs. This permission may depend on whether a Window in this VM is
already focused. Every attempt will be made to move this Window as high as
possible in the stacking order; however, developers should not assume that
this method will move this Window above all other windows in every
situation.
Insbesondere der letzte Satz läßt vermuten, daß es eben schon dazu kommen
kann, daß toFront() nicht funktioniert. Also ist toFront() kein
zuverlässiger weg.
Genau Daniel. Dieses Verhalten java.awt.Window#toFront() ist absolut
ungenügend. Zumindest unter Windows, da weiß ich selber wie das C geht,
hätte ich doch ein einwandfreies Funtionieren erwartet.
Post by Daniel Urban
Gruß,
Daniel
Gruß
Andre
Canken K.
2004-05-27 15:07:37 UTC
Permalink
Hi Andre,

das Programm dient als Email-checker. Es läuft als Thread und
schaut alle 2 Minuten nach neuen E-Mails in meinem Postfach.

Dazu habe ich ein Frame mit einem einzigen Button, der seine Farbe
ändert, falls eine Nachricht vorhanden ist. Das Button-Label zeigt
die Anzahl der Mails in meinem Postfach. Dabei ist das Frame
mit "setDecorated(false)" undekoriert, so dass ich es nicht direkt
minimieren kann. Aber wenn ich auf KDE mit "Arbeitsfläche
Anzeigen" alle Fenster minimiere und in der Zwischenzeit eine neue
Mail bekomme, kommt der Frame exakt nach den 2 Minuten wieder
hervor. Das gleich klappt auch, wenn der (oder das) Frame von
anderen Fenstern überdeckt ist.

Es sieht nicht nach Zufall aus.

Gruesse
Andre Teubner
2004-05-28 07:11:28 UTC
Permalink
Post by Canken K.
Hi Andre,
das Programm dient als Email-checker. Es läuft als Thread und
schaut alle 2 Minuten nach neuen E-Mails in meinem Postfach.
Dazu habe ich ein Frame mit einem einzigen Button, der seine Farbe
ändert, falls eine Nachricht vorhanden ist. Das Button-Label zeigt
die Anzahl der Mails in meinem Postfach. Dabei ist das Frame
mit "setDecorated(false)" undekoriert, so dass ich es nicht direkt
minimieren kann. Aber wenn ich auf KDE mit "Arbeitsfläche
Anzeigen" alle Fenster minimiere und in der Zwischenzeit eine neue
Mail bekomme, kommt der Frame exakt nach den 2 Minuten wieder
hervor. Das gleich klappt auch, wenn der (oder das) Frame von
anderen Fenstern überdeckt ist.
Es sieht nicht nach Zufall aus.
Ok...Unter Linux/ KDE scheint es zu funktionieren. Das Verhalten das es
nicht nach vorne geholt wird konnte ich nur unter Windows beobachten.
Ich werde dies mal auf einer Linuxbüchse verifizieren.
Post by Canken K.
Gruesse
Gruss
Andre

PS: Welche KDE Version..?
Canken K.
2004-05-27 13:13:13 UTC
Permalink
Danke für den Tip,

aber ich habe mich mit dem swt (noch) nicht befasst.
Kann man sowas auch mit awt/swing machen ?

Danke
Post by Jan Kassens
Post by Canken K.
Hallo,
ich habe eine kleine Anwendung geschrieben, die
immer im Vordergrund bleiben soll.
Hat man unter java diese Möglichkeit ?
Natürlich! Zum Beispiel kannst du mit SWT folgendermaßen ein Fenster
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
public class Main {
public static void main(String[] args) {
final Display display = new Display();
final Shell shell = new Shell(
display,
SWT.ON_TOP | SWT.TITLE | SWT.CLOSE
);
shell.open();
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
Post by Canken K.
Danke
bitte
Jan Kassens
Andre Teubner
2004-05-27 13:54:50 UTC
Permalink
Post by Canken K.
Danke für den Tip,
aber ich habe mich mit dem swt (noch) nicht befasst.
Kann man sowas auch mit awt/swing machen ?
Nur über JNI...je nach OS...unter Windows müßtest du dir das Handle des
Window's besorgen und das ON_TOP Flag/ Bit setzen. Im Netz kursieren
aber einige dll die du einbinden kannst und die obig Gewünschtes für
dich erledigen. Zum Bleistift diese hier:

http://www.esus.com/javaindex/j2se/jdk1.2/javaxswing/toplevelcontainers/jframe/jframealwaysontop.html
Post by Canken K.
Danke
Gruss
Andre
Ortwin Glück
2004-05-27 16:03:54 UTC
Permalink
Post by Canken K.
ich habe eine kleine Anwendung geschrieben, die
immer im Vordergrund bleiben soll.
Hat man unter java diese Möglichkeit ?
Mit Swing nicht direkt.
Wir haben das mal für eine Applikation plattformspezifisch gemacht. Ist
aber überhaupt nicht zu empfehlen. Du wirst dir immer Probleme mit dem
Focus einhandeln. Ich habe mich damals intensiv damit beschäftigt und
muss als Fazit sagen, Finger weg. Ob eine Applikation always-on-top ist,
das überlasse dem Windowmanager. Der User kann das selbst über den
Windowmanager festlegen wenn er das will, aber schreib es ihm nicht vor.
Ich weiss, unter Windows kann der User das mit Boardmitteln nicht. Es
gibt aber Tools, die beliebige Fenster so modifizieren können, dass sie
always on top sind. Mac OS-X hat übrigens eine ganz andere Philisophie.
Da wäre soetwas sowieso total daneben.
Manuel Hermann
2004-05-27 16:16:36 UTC
Permalink
Post by Ortwin Glück
Mac OS-X hat übrigens eine ganz andere Philisophie.
Da wäre soetwas sowieso total daneben.
Da ist das Problem eigentlich noch viel schlimmer. Jede größere
Applikation unter Mac OS X nutzt schwebende Palettenfenster, die nur
sichtbar sind, wenn auch die entsprechende Anwendung aktiv ist. Unter
Java habe ich ohne JNI keine Möglichkeit dieses (Standard-) Verhalten
nachzubilden.

Gruß
Manuel
Ulf Sattler
2004-05-28 07:39:56 UTC
Permalink
Post by Canken K.
Hallo,
ich habe eine kleine Anwendung geschrieben, die
immer im Vordergrund bleiben soll.
Hat man unter java diese Möglichkeit ?
Ich würde JFrame erweitern um diese Möglichkeit.

class MyJFrame extends JFrame implements WindowFocusListener{

private boolean onTop = false;

public MyJFrame(String titel){
super(titel);
this.addWindowFocusListener(this);
}

public boolean isOnTop(){
return onTop;
}

public setOnTop(boolean b){
onTop = b;
}

public void windowGainedFocus(WindowEvent event){
}

public void windowLostFocus(WindowEvent event){
if (onTop) {
this.requestFocus();
this.repaint();
}
}
}

Das könnte gehen, habs nicht getestet.

Viel Glück damit,
Ulf
Ortwin Glück
2004-05-28 09:36:44 UTC
Permalink
Post by Ulf Sattler
public void windowLostFocus(WindowEvent event){
if (onTop) {
this.requestFocus();
this.repaint();
}
}
}
Das könnte gehen, habs nicht getestet.
Vergiss das. Damit stielst du dem Anwender ständig den Focus. Very
annoying...

Lesen Sie weiter auf narkive:
Loading...