Fenster soll offen "im Vordergrund" sein und bleiben

Hallo Leute,

bei meinem Programm besteht nur ein kleines Problem. Ich rufe mit verschiedenen Buttons Fenster aus externen Klassen auf, die ich in das Projekt implementiert habe. Bei allen externen Klassen, die durch die zugewiesenen Buttons aufgerufen werden klappt das Öffnen auch und dass diese sichtbar bleiben. Bis auf dieses Fenster. Ich habe es auch bereits mit this.setAlwaysOnTop(true); versucht. Das brachte auch keine Verbesserung.

Hier der Code, auch von einem Fenster bei dem es funktioniert:

                add(fenster=new JButton("Fenstertext"));
                fenster.addActionListener(bl);
                fenster.setActionCommand("Fenstertext");
                
                add(geschwindigkeit=new JButton("Geschwindigkeit umrechnen"));
                geschwindigkeit.addActionListener(bl);
                geschwindigkeit.setActionCommand("Geschwindigkeit umrechnen");
  @Override
                public void actionPerformed(ActionEvent ae)
                {
                		Dimension d=Toolkit.getDefaultToolkit().getScreenSize().getSize();
                        if(ae.getActionCommand().equals("neues Fenster"))
                        {
                        	int a=0,b=0;
                                Fenster2 f=new Fenster2();
                                f.setLocation(a=(int)(d.getSize().getWidth())-(int)(d.getSize().getWidth()),b=(int)(d.getSize().getHeight()/2));
                        }
                        else if(ae.getActionCommand().equals("groesser"))
                        {
                                setSize(600, 800);
                        }
                        else if(ae.getActionCommand().equals("Geschwindigkeit umrechnen"))
                        {
                                GeschwindigkeitGrafisch geschw=new GeschwindigkeitGrafisch("");
                                int a=0,b=0;
                                geschw.setLocation(a=(int)d.getSize().getWidth()-300, b=(int)d.getSize().getHeight()+200);
                        }

Falls ihr hier einen Tipp habt, würde ich mich freuen :slight_smile:
Ich rufe insgesamt 3-4 andere Fenster auf. Deren Funktionsweise ist einwandfrei.

Lg

Moin,

hmm, was sollen wir jetzt mit Code machen, der funktioniert :confused:
Wäre es nicht sinniger den NICHT-funktionierenden Code zu posten :confused:
Und WO hast du das „setAlwaysOnTop“ getestet :confused:

Gruß
Klaus

Der Teil mit “Geschwindigkeit umrechnen” funktioniert bei mir nicht. Also das Fenster erscheint sehr kurz und verschwindet in den Hintergrund bzw. wird unsichtbar.
Das setAlwaysOnTop(true); habe ich jetzt unter die Location gesetzt. Aber es hat bisher noch nichts geholfen. Wie gesagt, bei den anderen Fenstern “Knöpfen” war es die selbe Vorgehensweise und es hat alles funktioniert.

Moin,

[QUOTE=alex2014]Also das Fenster … verschwindet in den Hintergrund bzw. wird unsichtbar.
[/QUOTE]
hmm, das sind aber zweio Paar Schuhe … was denn nun ??

Gruß
Klaus

mehr Kontrolle über deine Fenster hast du wenn du zum Beispiel einen JInternalFrame verwendest in einem Hauptfenster deines Programms:
http://docs.oracle.com/javase/tutorial/uiswing/components/internalframe.html

Es wird unsichtbar. Es ist zwar noch in der Taskleiste zu sehen, dass dort ein Fenster sein müsste, aber es lässt sich nicht “öffnen” und ist auch nicht im Hintergrund.

Ach das is schön, raten über Klassen die man nicht kennt. Versuch mal deinem Fenster eine Größe (setSize) zuzuweisen.

setVisible(jo); is auch gerne in Raterunden^^

Also zu Hause hat das Programm problemlos funktioniert. Nur auf der Arbeit funktioniert es nicht vernünftig.
Hier noch mal der Code der nicht funktioniert (zu Hause schon):

Dimension d=Toolkit.getDefaultToolkit().getScreenSize().getSize();
                     if(ae.getActionCommand().equals("neues Fenster"))
                     {
                    	 int a=0,b=0;
                         Fenster2 f=new Fenster2();
                         f.setLocation(a=(int)(d.getSize().getWidth())-(int)(d.getSize().getWidth()),b=(int)(d.getSize().getHeight()/2));
                     }
                     else if(ae.getActionCommand().equals("groesser"))
                     {
                         setSize(600, 800);
                     }
                     else if(ae.getActionCommand().equals("Geschwindigkeit umrechnen"))
                     {
                    	 int a=0,b=0;
                         GeschwindigkeitGrafisch geschw=new GeschwindigkeitGrafisch("");
                         geschw.setLocation(a=(int)d.getSize().getWidth()+50, b=(int)d.getSize().getHeight()+50);
                         setAlwaysOnTop(true);
                         setVisible(true);
                     }

also ich rate nicht sondern probiere, nur klappt es auf der Arbeit nicht so wie es soll. Ich habe jetzt auch noch mal zwei andere Verzweigungen mitgepostet, damit es ersichtlich ist.

du musst deinem Fenster bevor du es mit setVisible(true) sichtbar machst, auch eine Größe mit setSize() geben z.B. setSize(300,200)

zumindest steht in deinem Code dieser Aufruf nicht

Da es bei den anderen Fenstern auch ohne klappt, dachte ich, ich probiere es auch so. Ich habe es jetzt noch mal mit setSize probiert. Das klappt auch nicht. Könnte es vlt. auch an Eclipse selbst liegen? Also das es vlt. unterschiedliche Versionen sind? (Auf so etwas habe ich noch nicht geachtet).

Zeig bitte den aufrufenden Code im ActionListener so wie er jetzt ist und auch den code im Konstruktuor von GeschwindigkeitGrafisch

weiters diese Zeile ist nicht sehr hübsch
geschw.setLocation(a=(int)d.getSize().getWidth()+50, b=(int)d.getSize().getHeight()+50);
besser so

a=(int)d.getSize().getWidth()+50;
b=(int)d.getSize().getHeight()+50;
geschw.setLocation(a, b);```

Denn dann wäre vl früher aufgefallen, dass du die Location einfach ausserhalb des Bildschirm gesetzt hast.
da d die Größe des Bildschirms ist und du die Position dazu auch noch 50 Einheiten weiter verschiebst liegt dein Fenster jetzt 50 Pixel neben deinem Bildschirm.
vl enderst du dass nun auf 

a=(int)((d.getSize().getWidth()+50) /2);
b=(int)((d.getSize().getHeight()+50) /2);
geschw.setLocation(a, b);```

mit setLocationRelativeTo(null) kannst du übrigens Frames schön in die Mitte setzen.

Ich habe insgesamt drei innere ActionListener Klassen. Ich poste jetzt allerdings nur den Code des betreffenden ActionListeners

Code:

class ButtonListener implements ActionListener
        {
        	 Font schrift=new Font(Font.SANS_SERIF,Font.ITALIC, 12);
             Font schriftAlt=new Font(Font.SANS_SERIF,Font.BOLD,12);
             @Override
             public void actionPerformed(ActionEvent ae)
             {
             		Dimension d=Toolkit.getDefaultToolkit().getScreenSize().getSize();
                     if(ae.getActionCommand().equals("neues Fenster"))
                     {
                    	 int a=0,b=0;
                         Fenster2 f=new Fenster2();
                         f.setLocation(a=(int)(d.getSize().getWidth())-(int)(d.getSize().getWidth()),b=(int)(d.getSize().getHeight()/2));
                     }
                     else if(ae.getActionCommand().equals("groesser"))
                     {
                         setSize(600, 800);
                     }
                     else if(ae.getActionCommand().equals("Geschwindigkeit umrechnen"))
                     {
                    	 int a=0,b=0;
                         GeschwindigkeitGrafisch geschw=new GeschwindigkeitGrafisch("");
                         geschw.setSize(700, 100);
                         geschw.setLocation(a=(int)d.getSize().getWidth()+50, b=(int)d.getSize().getHeight()+50);
                         setAlwaysOnTop(true);
                         setVisible(true);
                     }
                     else if(ae.getActionCommand().equals("Rechner"))
                     {         
                    	 int a=0,b=0;
                         RechnerGui rechnerGui=new RechnerGui();
                         rechnerGui.setLocation(a=(int)(d.getSize().getWidth()/2)+(a-200), b=(int)(d.getSize().getHeight()/2)+(b-500));
                     }
                     else if(ae.getActionCommand().equals("Skisprung"))
                     {
                    	 int a=0,b=0;
                         Skisprung ski=new Skisprung();
                         ski.setLocation(a=(int)(d.getSize().getWidth()/2)+(a-200), (b=(int)d.getSize().getHeight()/2)+(b-850));
                     }
                     else if(ae.getActionCommand().equals("Fenstertext"))
                     {
                    	 int a=0,b=0;
                         Fenster f=new Fenster();
                         f.setLocation(a=(int)(d.getSize().getWidth())-((int)d.getSize().getWidth()), (b=(int)d.getSize().getHeight())-150);
                     }
                     else if(ae.getActionCommand().equals("kleiner"))
                     {
                    	 setSize(200, 200);
                     }
                     else if(ae.getActionCommand().equals("ursprung"))
                     {
                    	 setSize(400, 500);
                     }
                     else if(ae.getActionCommand().equals("neue Position"))
                     {
                    	 setLocation(300, 300);
                     }
                     else if(ae.getActionCommand().equals("andere Position"))
                     {
                    	 setLocation(400, 700);
                     }
                     else if(ae.getActionCommand().equals("alte Position"))
                     {
                    	 setLocation(0, 0);
                     }
                     else if(ae.getActionCommand().equals("Schrift aendern"))
                     {
                    	 neuerButton.setFont(schrift);
                         groesser.setFont(schrift);
                         groesser.setFont(schrift);
                         kleiner.setFont(schrift);
                         ursprung.setFont(schrift);
                         neuePos.setFont(schrift);
                         anderePos.setFont(schrift);
                         altePos.setFont(schrift);
                         neuSchrift.setFont(schrift);
                         alteSchrift.setFont(schrift);
                         rechner.setFont(schrift);
                         skisprung.setFont(schrift);
                         fenster.setFont(schrift);
                         geschwindigkeit.setFont(schrift);
                     }
                     else if(ae.getActionCommand().equals("rueckgaengig"))
                     {
                    	 neuerButton.setFont(schriftAlt);
                         groesser.setFont(schriftAlt);
                         kleiner.setFont(schriftAlt);
                         ursprung.setFont(schriftAlt);
                         neuePos.setFont(schriftAlt);
                         anderePos.setFont(schriftAlt);
                         altePos.setFont(schriftAlt);
                         neuSchrift.setFont(schriftAlt);
                         alteSchrift.setFont(schriftAlt);
                         rechner.setFont(schriftAlt);
                         skisprung.setFont(schriftAlt);
                         fenster.setFont(schriftAlt);
                         geschwindigkeit.setFont(schriftAlt);
                     }
             }
        }

:rolleyes:

Ich habe mit der Location rum experimentiert… ich dachte, ich hätte es so angegeben, dass es auf dem Bildschirm angezeigt wird… s. Locations der anderen Fenster. Aber da lag ich wohl falsch… Danke für den Hinweis :slight_smile:

Hat es jetzt mit der neuen Location funktioniert ?

Es ist nicht ganz klar, ob das problem somit gelöst ist.
Falls ja bitte Thema als gelöst markieren ( ist der Knopf links unter dem Thread)

Ja :slight_smile: