setAlwaysOnTop(true); toFront(); - bringt alles nichts

Hallo community,

ich versuche mal mein Problem darzulegen.
Ich habe mir ein Programm zusammen geklaut, welches nur ein Bild im Vollbildmodus anzeigen soll.
Und dieses soll immer im Vordergrund stehen und von keinem anderen Programm/Fenster sich diese Position nehmen lassen.
Unter Linux funktioniert das wunderbar, nur Windows ist da bisschen eigen. Wenn dem Java-Prog. der Fokus genommen wird, zB. durch wechseln mit Alt-Tab, geht das Gezappel auf dem Bildschirm los. Beide Programme streiten sich dann um die vordere Position auf Monitor, immer im Wechsel.

Versucht habe ich es mit setAlwaysOnTop(true); setVisible(true); toFront();, einzeln und auch alle zusammen.

Hat jemand eine Idee die ich noch nicht googeln konnte?

Java:
import java.awt.Graphics;
import java.awt.GraphicsEnvironment; 
import java.awt.Image; 
import java.awt.Toolkit; 
import java.awt.event.FocusEvent; 
import java.awt.event.FocusListener; 
import java.awt.event.MouseEvent; 
import java.awt.event.MouseListener; 
import java.awt.event.WindowAdapter; 
import java.awt.event.WindowEvent; 
import java.net.MalformedURLException;
import javax.swing.JFrame;
 
public class ShowImage extends JFrame{
       // this line is needed to avoid serialization warnings  
       private static final long serialVersionUID = 1L;
       Image screenImage; // downloaded image  
       int w, h; // Display height and width
 
       public static void main(String[] args) throws MalformedURLException {
               new ShowImage("Wallpaper.JPG");
       }
 
       // Class constructor  
       ShowImage(String source) throws MalformedURLException {
          // Exiting program on window close
           addWindowListener(new WindowAdapter() {
               public void windowClosing(WindowEvent e) {
                   System.exit(0);
               }
           });
 
           // Exitig program on mouse click
           addMouseListener(new MouseListener() {
               public void mouseClicked(MouseEvent e) { System.exit(0); }
               public void mousePressed(MouseEvent e) {}
               public void mouseReleased(MouseEvent e) {}
               public void mouseEntered(MouseEvent e) {}
               public void mouseExited(MouseEvent e) {}
           });
 
           addFocusListener(new FocusListener() {
             // setAlwaysOnTop(true); setVisible(true); toFront();
             public void focusLost(FocusEvent e) {toFront();} 
             public void focusGained(FocusEvent e) {}               
            });
 
           // remove window frame  
           this.setUndecorated(true);
 
           // window should be visible
           this.setAlwaysOnTop(true);
           this.setVisible(true);
           this.toFront();
 
           // switching to fullscreen mode
           GraphicsEnvironment.getLocalGraphicsEnvironment().
           getDefaultScreenDevice().setFullScreenWindow(this);
 
          // getting display resolution: width and height
           w = this.getWidth();
           h = this.getHeight();
 
           // loading image  
          screenImage = Toolkit.getDefaultToolkit().getImage(this.getClass().getResource(source)); // otherwise - file
       }
 
       public void paint (Graphics g) {
           if (screenImage != null) // if screenImage is not null (image loaded and ready)
               g.drawImage(screenImage, // draw it  
                           w/2 - screenImage.getWidth(this) / 2, // at the center  
                           h/2 - screenImage.getHeight(this) / 2, // of screen
                           this);
               // to draw image at the center of screen
               // we calculate X position as a half of screen width minus half of image width
               // Y position as a half of screen height minus half of image height
       }
}


Über eine Antwort würde ich mich freuen, und für Eure Mühe Dank im voraus.
 
Das scheint nur zusammen mit setUndecorated(false) ordentlich zu funktionieren, aber dann ist latürnich die Titelleiste und Umrandung des Fensters weg.
 
Ich bin kein Windoof User (zumindest privat nicht...) und kein Fat-Client Entwickler, aber: Der Taskmanager unter Win XP macht das normalerweise doch auch so, wie es der User gerne hätte?
 
Das scheint nur zusammen mit setUndecorated(false) ordentlich zu funktionieren, aber dann ist latürnich die Titelleiste und Umrandung des Fensters weg.

Danke Dir "Landei" für Deine schnelle Antwort.
Und ja, Du hast recht, wenn man die Titelleiste dran läßt funktioniert es, schöner wäre aber ohne.

P.S. den Anderen danke ich natürlich auch für ihre Beiträge, den es scheint so zu sein, wie "Guybrush Threepwood" schreibt, daß Windows dieses Verhalten unterbindet.
 
Zuletzt bearbeitet:
Ich bin kein Windoof User (zumindest privat nicht...) und kein Fat-Client Entwickler, aber: Der Taskmanager unter Win XP macht das normalerweise doch auch so, wie es der User gerne hätte?

Das ist richtig, aber da gibt es sicher irgendwelche speziellen systemeigenen Funktionen, die man ohne weiteres nicht aus Java heraus ansprechen kann. Für "normale" Programme ist es nicht vorgesehen, sich in den Vordergrund drängeln zu können. Wenn ein Programm das versucht blinkt bei Windows in diesem Fall der jeweilige Eintrag in der Taskleiste, um auf das Programm aufmerksam zu machen.
 

Neue Themen


Zurück
Oben