# AWT FileDialog



## cschnell (5. Aug 2005)

Hallo zusammen,

Ich bin neu hier und möchte mich erstmal vorstellen:
Ich heisse Christopher, wohne und schreibe Diplomarbeit in Basel und studiere in Deutschland an der FH Zweibrücken.

Für mein Problem habe ich trotz langer und ausführlicher Suche noch keine Lösung gefunden. Deshalb probiere ich es mal hier. Also:

Ich habe eine Flash-Applikation, die XML-Daten an einen kleinen Java-Server schickt, der es erlaubt, die Daten im Filesystem zu speichern. Der Java-Server läuft in einer Konsole im Hintergrund und im Browser erstelle ich meine Daten mittels Flash. Wenn ich mit meiner Arbeit zufrieden bin, klicke ich in der Flash-Applikation auf "Speichern", die Daten gehen an den Java-Server und werden in die vorgesehene XML-Datei gespeichert. Soweit Sogut.

Nun gibt es die Möglichkeit, eine spezielle Datei auszuwählen. Ich schicke also eine bestimmte Nachricht an den Java-Server, und der erstellt einen ganz normalen awt.FileDialog also in etwa


```
Frame f = new Frame();
FileDialog fileDialog = new FileDialog( f );
fileDialog.setMode( FileDialog.SAFE );
fileDialog.setTitle( "Datei W\344hlen" );
fileDialog.show( );
```

Das dumme daran ist nur: die VM läuft ja in der Konsole im Hintergrund. Also geht auch der FileDialog *hinter* dem Browser auf. Und der ist natürlich Fullscreen. Beim Mac-OS ist das nicht ganz so schlimm, da sich der Java-Task bemerkbar macht, aber unter Windows sieht man einfach gar nicht, dass etwas passiert ist.

Mit fileDialog.toFront(); geht es leider auch nicht, weil der Dialog prinzipiell ja im Vordergrund seiner VM ist. nur nicht im Vordergrund vom Browser.

Weiss irgendwer, wie man vielleicht den Programmen beibringen kann, dass sie den Fokus wechseln? Oder irgendeine Art, auf die sich das Fenster bemerkbar machen könnte?

ich bin schon Fast soweit, etwas wie 

```
_fileDialog.addWindowListener(
    new WindowAdapter(){
        public void windowOpened(WindowEvent e)
        {
            Toolkit.getDefaultToolkit().beep();
         }
    });
```

zu schreiben...

Vielen Dank für eure Tipps,

Gruss,
Christopher

EDIT:

hatte vergessen zu sagen, dass es nach Möglichkeit ein AWT-Dialog und Konsolenprogramm bleiben soll, da hohe Performance wichtig ist.


----------



## Beni (5. Aug 2005)

Versuchs anstelle von "toFront" mal mit "requestFocus". Laut API sollte das die Component an die Spitze bringen.


----------



## cschnell (5. Aug 2005)

Hi,

Danke für die superschnelle Antwort.

Leider verhält sich requestFocus() nicht anders. Das Problem ist ja, dass die Komponente "in front" der JVM ist. Und auch den Focus hat. Es schafft einfach nicht den "Sprung" über den Browser.


----------



## Roar (5. Aug 2005)

wenn du Java 1.5 verwendest kannst du die methode setAlwaysOnTop(true) verwenden, dadurch sollte der dialog auch den fullscreen browser hinter sich lassen.


----------



## cschnell (5. Aug 2005)

das werde ich auf jeden Fall mal unter Windows ausprobieren. Leider ist Mac-Kompatibilität zwingend und für OSX gibt es immer noch kein 1.5

Hat sich was mit Plattformunabhängigkeit 

Aber auch danke für den Tip, werde es übers wochenende testen.


----------



## Beni (5. Aug 2005)

cschnell hat gesagt.:
			
		

> für OSX gibt es immer noch kein 1.5.


Öhm?


----------



## Bleiglanz (5. Aug 2005)

hmm

was solln das bringen?

wozu flash UND ein java server, die beide am gleichen Rechner laufen müssen

wenn der java-server mal auf einem anderen host läuft, wer soll dann den file-dialog bedienen??


----------



## cschnell (5. Aug 2005)

Beni hat gesagt.:
			
		

> cschnell hat gesagt.:
> 
> 
> 
> ...



von http://developer.apple.com/java/download/



> Java 2 Platform Standard Edition (J2SE) 5.0 Release 1 provides support for J2SE 5.0 on Mac OS X 10.4. This release is based on JDK version 1.5.0_02 and does not replace the existing installation of J2SE 1.4.2.



äh ja, ich hätte das ganze natürlich gerne als Version für 10.3x und das gibt es nicht und wird es vielleicht auch nie mehr geben


----------



## cschnell (5. Aug 2005)

Bleiglanz hat gesagt.:
			
		

> hmm
> 
> was solln das bringen?
> 
> ...



Das bringt, dass ich aus Flash raus Dateien sichern kann. Sozusagen ein in Flash laufendes Autorensytem mit CMS. Und der Java-Server wird nie auf einem andere Host laufen.

Flash ist ein Sandkasten. Ich kann darin tolle Burgen bauen, aber wenn ich sie nach draussen tragen will, bleibt nichts übrig.

Ausserdem war das ja nicht die Frage


----------



## cschnell (8. Aug 2005)

Hallo nochmal,

für alle, die sich noch erinnern:

Ich habe am WE mal den oben gegebenen Tipp ausprobiert (also window.setAlwaysOnTop(boolean b))

Leider genau das gleiche Ergebnis wie vorher, für die VM scheint das Fenster, in dem sie läuft, das Mass aller Dinge zu sein. Wenn ein Dialog "on Top" dieses Fensters ist, dann ist es für die VM erledigt. Andere Programme haben damit nichts zu tun und bekommen auch kein Fenster übergelegt.

In meiner Verzweiflung habe ich es sogar auch mit dem Swing JFileChooser ausprobiert, auch das verhält sich gleich.

Hat noch irgendwer gute Tipps?


----------



## Bleiglanz (8. Aug 2005)

workaround:

fixiere ein Verzeichnis (oder lass den namen des Verzeichnisses direkt im Flash "eintippen") und mach alles innerhalb von flash 

d.h. du schickst auch den Verzeichnisnamen an deinen Server, holst dir ggf. mit File#list die einträge usw.

Nachteil: User kann nicht "Browsen"

Vortail: nur eine GUI


----------



## cschnell (8. Aug 2005)

Hi,

das ist an sich eine gute Idee...wenn ich dich richtig verstanden habe. Und ist auch schon implementiert.

Ok, ich sollte wohl noch etwas die Applikation beschreiben:

Der User kann mit einer GUI in Flash die Inhalte seines Filmes editieren (Texte, Bilder, Movies usw.) Im Normalfall klickt er dann auf "speichern" und der Java-Server bekommt den richtigen Pfad und die richtige Datei sowie den Inhalt geschickt. Dann speichert er alles in der geschickten Datei. In diesem Fall ist also gar kein GUI nötig

Ein anderer Fall: Der Benutzer möchte ein anderes Bild einbinden. Dazu kann er entweder den Pfad von Hand eintippen -> kein Problem. Oder er weiss ihn nicht und möchte das Bild per GUI einbinden. Dann klickt er auf "Datei suchen" und ein FileDialog geht auf. Leider gibt es in Flash keinen (oder ich kenne keinen - aber die Frage sollte ich wohl in einem Flash Forum stellen ), sonst würde ich diesen verwenden und den ausgelesenen Pfad an den Java-Server schicken.

Meine Idee war also: ich schicke meinen Dialogbefehl an den Java-Server, der macht den FileDialog auf und gibt mir den Pfad zurück und für den User ist das Bild eingebunden. Allerdings sieht es momentan wirklich so aus, wie wenn ich was in Flash bauen müsste. Wär nur viel einfacher in Java gewesen.

Generell sehe ich allerdings in diesem Verhalten der JVM ein Problem, verstehe aber auch woran es liegt. Die einzige Lösung, die ich bis jetzt gefunden habe, ist über jawt eine native Windows-Oberfläche zu bauen. Aber das ist erstens recht viel Arbeit und zweitens nicht erstrebenswert


----------



## Nova (8. Aug 2005)

Hallo,

Hab alles nur kurz überflogen, also sorry falls die Vorschläge schon kamen.

setAlwaysOnTop setzt das Fenster nur "an die Spitze" des aktuellen Java-Programms.
setModal(true) bewirkt dass das Fenster auch über anderen Fenstern steht, weiß aber nicht ob du das verwenden kannst.

Keine Ahnung ob das funktioniert, habs nicht ausprobiert:
Eventuell kommt das Fenster in den Vordergrund wenn du das Fenster minimierst und wieder maximierst?
vielleicht auch mal
setFocusable(true)
requestFocus()
in deinem Fenster probieren


mfg
Christian


----------



## Roar (8. Aug 2005)

Nova hat gesagt.:
			
		

> setAlwaysOnTop setzt das Fenster nur "an die Spitze" des aktuellen Java-Programms.


nein, setAlwaysOnTop() sagt, dass das fenster immer über allen anderen fenstern (ausgenommen anderen alwaysontop fenstern) ist. systemweit.



> setModal(true) bewirkt dass das Fenster auch über anderen Fenstern steht


 ne, das widerum sagt, dass man nicht zum parent fenster wechseln kann solange der dialog noch angezeigt wird.


----------



## cschnell (8. Aug 2005)

Roar hat gesagt.:
			
		

> Nova hat gesagt.:
> 
> 
> 
> ...



Das funktioniert aber (zumindest bei mir) nicht. mein Code:

```
Frame frame = new Frame();
FileDialog fileDialog = null;
fileDialog = new FileDialog(frame);
fileDialog.setTitle( "Datei Speichern" );
fileDialog.setMode(FileDialog.SAVE);
fileDialog.setVisible(true);
fileDialog.setAlwaysOnTop(true);
...
```

Nach wie vor bleibt das Fenster unter dem Browser (getestet mit IE und FF)


----------



## MPW (8. Aug 2005)

Das kann aber nicht sein.
Benutzt du deinen Browser auch irgendwie mit AlwaysOnTop oder sowas?

Das einzige was über AlwaysOnTop Fenster drüber kommt ist der Taksmanger und alt+tab Programmwechseln für kurze Zeit..wird dann aber auch wieder geplättet...

Wird denn das Fenster wirklich angezeigt, oder liegt das Problem vielleicht an einer anderen Stelle?


----------



## MPW (8. Aug 2005)

Also, um jetzt mal sicherzustellen, dass wir nicht alle aneinander vorbeireden oder so, hab' ich da mal was gemacht.
Bitte probier doch mal aus, ob das über deiner Flashapplikation zu sehen ist...oder wird Flash vielleicht wie ein Video implementiert, dass wird ja anders verarbeitet(overlay?).
Naja guckt euch das mal an und @Thread-owner, bitte teste das mal:


```
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import java.lang.InterruptedException;
import java.awt.Dimension;
import java.awt.Toolkit;

class Topping extends JFrame implements Runnable {
	static Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
	Thread showIt = new Thread(this);

	public Topping() {
		add(new JLabel("Hier kommst du nicht drüber"));
		setTitle("Ich=oben");
		pack();
		setAlwaysOnTop(true);
		setLocation((int)((dim.getWidth() - getWidth())/2), (int)((dim.getHeight() - getHeight())/2));
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		showIt.start();
	}
	public void run() {
		while (true) {
			setVisible(true);
			try {
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				JOptionPane.showMessageDialog(this, e, "ops...Fehler", JOptionPane.ERROR_MESSAGE);
			}
			setVisible(false);
			try {
				Thread.sleep(5000);
			} catch (InterruptedException e) {
				JOptionPane.showMessageDialog(this, e, "ops...Fehler", JOptionPane.ERROR_MESSAGE);
			}
		}
	}
	public static void main(String args[]) {
		new Topping();
	}
}
```

bis denn...

MfG
MPW

//edit: wuah, 5 Rechtschreibfehler, die mussten korrigiert werden!


----------



## cschnell (9. Aug 2005)

Super,

unter 1.5 funktionierts damit jetzt also. das Problem lag eher darin, den FileDialog erst dann zu öffnen, wenn das JFrame da ist. Ganz klar ist es mir noch nicht, aber nach einigem Hin und Her gings dann.

ich habe es nun aufs AWT umgeschrieben und nun erscheint ein kleiner Frame, den man gar nicht bemerkt (für eine erste version uninteressant) und der FileDialog.

 :applaus: 

Hier noch mein Code:


```
import java.awt.*;

class Topping extends Frame implements Runnable {
   Thread showIt = new Thread(this);
   
   public Topping() {
	   setAlwaysOnTop(true);
	   requestFocus();
	   showIt.start();
   }
   
   public void run() {
	   setVisible(true);		 
	   requestFocus();
	   FileDialog filedialog=new FileDialog(this);
	   filedialog.setMode( FileDialog.LOAD );
	   filedialog.setTitle( "Datei W\344hlen" );
	   filedialog.setVisible(true);
		 
	   String _file = filedialog.getDirectory( ) + filedialog.getFile( );
		 		 
	   if ( filedialog.getFile() != null ) {
 			// do someting
	   }
	   else {
		   // do someting
	   }
	   this.setVisible(false);
   } 
}
```

Für Java 1.4.2 weiß nicht zufällig jemand was


----------



## MPW (9. Aug 2005)

Aber was ich jetzt nicht kapiere, warum wieder mit awt, gefällt dir swing nicht? - Naja egal, vielleicht habe ich oben was überlesen...

1.4.2...hm sieht verdammt schlecht aus...
Du müsstet irgendwie den Focus drauf setzen...

Ich weiß nicht, ob's da eine Java-Funtkion gibt die das auch macht wenn das Java-programm keinen Focus hat.
Notfalls musst du dir eine c-Überbrückung schreiben oder versuchen aus flash da was zu machen(ich hab' 0 Ahnung von Flash).

Kann man denn nicht das 1.5 auf deine OS-Version irgendwie draufknallen? Ich benutze kein mac hab' daher keine Ahnung in der Richtung. Aber sind 10.4 und 10.3 so verschieden?
Und außerdem, mit "es muss Mac-Kompatibiltät gegeben sein" legst du dich doch nicht auf 10.3 fest, es reicht doch 10.4 oder?
(Du kannst es zwar selber nicht testen, aber du kannst dich eigenltich recht darauf verlassen, wenn's einmal läuft, läuft's!)


----------



## Guest (9. Aug 2005)

MPW hat gesagt.:
			
		

> Aber was ich jetzt nicht kapiere, warum wieder mit awt, gefällt dir swing nicht? - Naja egal, vielleicht habe ich oben was überlesen...



Das hat verschiedene Gründe:
1. AWT-Dialog sieht imo besser aus (zumindest OS-näher...das sind die leute gewöhnt und hat zumindest auf Mac nur Vorteile)
2. soviel ich weiss verwendet ATW weniger Resourcen als Swing. Das macht es in dem Fall interessanter



			
				MPW hat gesagt.:
			
		

> Ich weiß nicht, ob's da eine Java-Funtkion gibt die das auch macht wenn das Java-programm keinen Focus hat.
> Notfalls musst du dir eine c-Überbrückung schreiben oder versuchen aus flash da was zu machen(ich hab' 0 Ahnung von Flash).



C(++)-Überbrückungen gibts grundsätzlich. aber dann bin ich nicht mehr so unabhängig.



			
				MPW hat gesagt.:
			
		

> Kann man denn nicht das 1.5 auf deine OS-Version irgendwie draufknallen? Ich benutze kein mac hab' daher keine Ahnung in der Richtung. Aber sind 10.4 und 10.3 so verschieden?
> Und außerdem, mit "es muss Mac-Kompatibiltät gegeben sein" legst du dich doch nicht auf 10.3 fest, es reicht doch 10.4 oder?
> (Du kannst es zwar selber nicht testen, aber du kannst dich eigenltich recht darauf verlassen, wenn's einmal läuft, läuft's!)



Das mit 1.5 auf 10.3 wäre zu testen... würde aber nicht das Hauptproblem lösen. Das besteht nämlich darin, dass wenn man für grosse Firmen mit 10000++ Rechnern und entsprechende Sicherheits- und Softwarerichtlinien etwas entwickelt, dann kann man nicht einfach so ne neue Java-Version verlangen. und wenn da nur 1.4.2 drauf ist, muss man leider damit leben.

Aber danke für die vielen Tipps


----------



## MPW (9. Aug 2005)

Okay, man kann im Gegenzug auch von einer alten Java-Version nicht alles verlangen;-). Wenn die alles könnte, bräuchte man ja nicht mehr weiterzuentwickeln. Entweder man ist up-to-date oder nicht.

Zu "swing ist nicht OS" nahe: ließ mal das Kapitel über Look&Feel micht hat das zunächst auch gestört, jetzt lege ich das Look&Feel immer fest, dann gefällts mir auch besser, das standart sieht wirklich ätzend aus(wobei ich nciht weiß, welches da unter mac verwedet wird, kann da nur von Windows sprechen)


----------



## cschnell (9. Aug 2005)

tja, so läuft das leider trotzdem häufig...

um einen grossen Versionskonflikt zu vermeiden habe ich als Übergangsloesung jetzt das ganze einfach für 1.4.2 kompiliert und catche an der entsprechenden Stelle den NoSuchMethodError. Das klappt soweit, dass auf 1.5er Systemen der Dialog in den Vordergrund kommt und auf anderen Systemen (vorerst) ein Signalton, eine Message in der Konsole und ein Warnhinweis im Flash. Die Funktion ist nicht beeinträchtigt.

das sollte erstmal reichen 

Also vielen Dank nochmal, ohne die Hilfe hätt ich das wohl nicht so schnell geschafft


----------



## MPW (9. Aug 2005)

^^kein Problem, war wirklich mal eine etwas interssantere Fragestellung als die meisten hier


----------

