Swing Window nur bedingt im Vordergrund

beastofchaos

Bekanntes Mitglied
Hallo Leute,
Ist es möglich, dass ich mit einer Eigenschaft einstelle, dass in meinem Programm (mit seinem "Hauptfenster") ein Fenster nur dann sich in den Vordergrund setzt, wenn auch das Hauptfenster offen ist. Beispiel dafür wäre Paint.Net, wo Farb-, Tool-, Ebenen- und ähnliche Fenster offen sind.

Ich dachte möglicherweise daran, in der paint-Methode dieses speziellen Fensters abzufragen, ob das Hauptfenster oder das Fenster selber im Vordergrund. Ehrlich gesgat, glaub ich auch nicht, dass das funktioniert, und vorallem macht man sowas ja nicht in einer paint-Methode (Vll in "isAlwaysOnTop()"...).
Hab aber beides auch noch nicht ausprobiert.

Gruß, Euer Thomas
 
Folgenden Code hab ich schon ausprobiert(main ist das Hauptfenster, Text ist im Konstruktor von dem "Unterfenster"). Aber leider funktioniert es immer noch nicht.

Java:
addWindowFocusListener(new WindowAdapter(){
            @Override
            public void windowLostFocus(WindowEvent e){
                boolean a = main.isFocused();
                boolean b = isFocused();
                System.out.println(a + " --- " + b);
                if (main.isFocused() || isFocused()){
                	setAlwaysOnTop(true);
                }
                else{
                	setAlwaysOnTop(false);
                }
            }
            
            @Override
            public void windowGainedFocus(WindowEvent e){
                boolean a = main.isFocused();
                boolean b = isFocused();
                System.out.println(a + " --- " + b);
                if (main.isFocused() || isFocused()){
                	setAlwaysOnTop(true);
                }
                else{
                	setAlwaysOnTop(false);
                }
            }
        });

Ich bin ratlos, könnt ihr mir helfen?

Gruß, Thomas
 
Ich benutze bereits einen JDialog. Habs mit seModal false und true versucht. Hab jetzt eher die Idee gehabt, dass ich mit dem WindowListener des Hauptfenster spiele. Wenn er den Focus bekommt, soll er das Unterfenster visible machen. Bei LostFocus andersrum.
Leider wird das Unterfenster automatisch anfokusiert, wenn es visible wird, was dann zu LostFocus vom Hauptfenster führt. DDas sieht dann so aus, dass die beiden die ganze Zeit blinken - also immer wieder gegenseitig den Focus bekommen :/
Hab das mit ner globalen Boolean umgehen wollen, aber dann komm ich wieder iwie auf das Ergebnis, dass das Unterfenster immer AlwaysOnTop wird.

Hier mal mein Versuch, dem Hauptfenster das einzuspeisen:
Java:
public abstract class EDModel extends JDialog{
    private int value;
    private JTextField fieldValue;
    private JScrollBar scroller;
    
    private BufferedImage oldImg;
    private ArrayList<EDModel> listDialogs;
    private Main main;
    public boolean alwaysOnTopChanged = false;
    
    public EDModel(ArrayList<EDModel> dialogs, Main target, String title){
        super();
        listDialogs = dialogs;
        listDialogs.add(this);
        oldImg = ((ImageDesign)Saves.properties.process.getPaints().clone()).getImage();
        setTitle(title);
        setSize(132, 500);
        main = target;
        setLocation(getSpecialLocation(main.center));
        setVisible(true);
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        main.addWindowFocusListener(new WindowAdapter(){
            @Override
            public void windowLostFocus(WindowEvent e){
            	if (alwaysOnTopChanged || EDModel.this.isFocused() || EDModel.this.isVisible()){
                	alwaysOnTopChanged = false;
            		return;
            	}
            	alwaysOnTopChanged = true;
                EDModel.this.setAlwaysOnTop(false);
                EDModel.this.setVisible(false);
            }
            
            @Override
            public void windowGainedFocus(WindowEvent e){
            	if (alwaysOnTopChanged){
                	alwaysOnTopChanged = false;
            		return;
            	}
            	alwaysOnTopChanged = true;
                EDModel.this.setAlwaysOnTop(true);
                EDModel.this.setVisible(true);
            }
        });
        ...
    }
    ...
}

Habt ihr noch ne Idee. Sonst muss ich wohl oder übel darauf umswitchen, dass ich statt einem extra Fenster iwie ein JPanel speziell einbaue mit nem Custom-LayoutManager, damit es z.B. die rechte Seite zur Hälfte einnimmt.
Oder ich nem eine ToolBar, wobei ich bei denen immer Probleme habe, die zu löschen oder zu versetzen (per Quelltext).

Was empfehlt ihr mir? (Fenster weiter versuchen, eigener LayoutManager, ToolBar basteln)

Gruß, Thomas
 
in deiner JDialogKlasse
Java:
super.JDialog(deinFrame);//an Stelle von super();...damit bestimmst du den Owner
...setModal(false);!!!
das is alles was du benötigst, dann kannste das ganze Heckmeck wieder rausschmeißen.😀
Gruß Vanny
 
Zuletzt bearbeitet von einem Moderator:

Zurück
Oben