Ich habe folgenden MouseListener auf einem Button:
Java:
button.addMouseListener(newMouseAdapter(){@OverridepublicvoidmouseClicked(MouseEvent arg0){if(wrtf.WriteToFile(points, tf.getText())==true){
label.setText("<html>Ihr Rekord wurde erfolgreich eingetragen.<br />Drücken Sie auf den Button um ein neues Spiel zu beginnen!</html>");
form.setVisible(false);}else{
label.setText("<html>Leider konnte Ihr Rekord nicht eingetragen werden.<br />Drücken Sie auf den Button um ein neues Spiel zu beginnen!</html>");
form.setVisible(false);}}});
Das Komische ist jetzt aber, dass er zwar in Eclipse funktioniert, aber sobald ich das Projekt als runnable jar-file exportiere, reagiert der Button nicht mehr auf einen Klick. Wieso das?
Wieso ist ein ActionListener besser auf einem Button?
Also, ich habs getestet, der Fehler liegt tatsächlich in der aufgerufenen Funktion. Allerdings kann ich ihn mir nicht erklären ... denn in Eclipse funktioniert es ja.
Wenn ich mir das "hierher" der OptionPane nur einen Befehl später ausgeben lassen will, Funktioniert es nicht mehr. D.h. der Fehler liegt irgendwo unter der OptionPane. Allerdings kann ich ihn nicht sehen ...
Die Methode urlToFile() habe ich aus dem Internet. Die sieht so aus:
Java:
publicFileurlToFile(URL url){URI uri;try{// this is the step that can fail, and so// it should be this step that should be fixed
uri = url.toURI();}catch(URISyntaxException e){// OK if we are here, then obviously the URL did// not comply with RFC 2396. This can only// happen if we have illegal unescaped characters.// If we have one unescaped character, then// the only automated fix we can apply, is to assume// all characters are unescaped.// If we want to construct a URI from unescaped// characters, then we have to use the component// constructors:try{
uri =newURI(url.getProtocol(), url.getUserInfo(), url
.getHost(), url.getPort(), url.getPath(), url
.getQuery(), url.getRef());}catch(URISyntaxException e1){// The URL is broken beyond automatic repairthrownewIllegalArgumentException("broken URL: "+ url);}}returnnewFile(uri);}
du erstellst ein Jar, packst also dein ganzes Projekt in eine Art Zip-Datei,
so dass z.B. keine Unterverzeichnisse mehr im Dateisystem vorhanden sind
und dass dann irgendwas mit URL, File, Festplatte nicht mehr funktioniert macht dich überhaupt nicht stutzig?
du erstellst ein Jar, packst also dein ganzes Projekt in eine Art Zip-Datei,
so dass z.B. keine Unterverzeichnisse mehr im Dateisystem vorhanden sind
und dass dann irgendwas mit URL, File, Festplatte nicht mehr funktioniert macht dich überhaupt nicht stutzig?
Ich hatte grosse Mühe, die Datei überhaupt irgendwie zu erreichen. Wenn ich es ohne URL versucht hatte, dann wurde die Datei vom System überhaupt nicht gefunden ... Selbst wenn sie im gleichen Verzeichnis lag und ich einfach ihren Namen eingab, sie wurde nicht gefunden. Ich komme einfach mit diesen Dateien nicht klar!!!
schreibe bitte
e.printStackTrace();
in das catch, die Konsolenausgabe siehst du doch hoffentlich?
was du mit Dateien so alles machst, ist für andere bisher unklar, da müsstest du mehr erklären,
aus meiner Sicht ist jedenfalls die urlToFile()-Methode völlig überflüssig für Dateien, wo kommt denn die url her?
wichtige Code-Zeilen sind dazu:
File f = new File(..);
System.out.println(f.getAbsolutePath());
System.out.println(f.exists());
Das Problem ist ja eben, dass ich beim Ausführen als jar-Datei in einem Fenster KEINE Konsole habe und keine Fehler sehe. In Eclipse funktioniert alles.
Die URL wird so erzeugt und dann an die Klasse geliefert:
naja, solange kein ordentliche Konsole mit Debugging usw. steht, musst du über alle anderen Probleme gar nicht nachdenken
wie du mit Dateien umgehen kannst habe ich schon geschrieben (AbsolutePath) bzw. nach Lehrbuch, neuer FileStream usw.,
jede Fehlermeldung auch anschauen, nicht nur andere fragen, die wissen auch nicht mehr
Java:
publicclassTest{publicstaticvoidmain(String[] args)throwsException{showException(newException());}publicstaticvoidshowException(Exception e){StringWriter st =newStringWriter();PrintWriter p =newPrintWriter(st);
e.printStackTrace(p);
p.close();JOptionPane.showMessageDialog(null, st.toString());}}
Weder eine Fehlermeldung in der Konsole, noch geschieht sonst was ... was läuft da falsch?
EDIT: Problem gelöst:
Da ich den Pfad nicht wusste, habe ich nun einfach das Programm selbst die Datei erstellen lassen. So weiss das Programm selbst auch, wo diese Datei ist. Danke für die Geduld und Hilfe!
Wenn der Hinweis in der Konsole nicht erscheint (ich gehe hier mal davon aus, dass Du die Systemausgabe nicht umgebogen hast) , dürfte das Problem ganz woanders liegen als in diesen Zeilen. :autsch:
EDIT: Markier doch den Thread auch mal als erledigt...
EDIT 2: Mir wäre das nicht geheuer, wenn ich nicht wüsste, wo die bearbeiteten Dateien eigentlich landen... dabei hat SlaterB Dir eigentlich nen prima Tipp gegeben... Es zahlt sich nicht aus, das jetzt quick&dirty zu beheben, statt das Problem zu verstehen... ist immer dumm, wenn man seinen eigenen code nicht versteht ;-(
Also ide Datei wird nun ausserhalb der jar-Datei erstellt. Das ist eigentlich gar nicht so schlecht. Ich weiss wo sie ist. Ist es überhauot möglich, diese Datei IN der jar-Datei zu haben? Wenn ja, wie wäre dann der Pfad? file.jar/records.txt ... wohl eher nicht, oder?
Da Du zur Laufzeit in die Datei schreibst, ist das jar-Archiv der falsche Platz. Das Archiv wird ja zur Laufzeit verwendet und ist somit schreibgeschützt.