Klick auf Button -> JFrame öffnet sich erneut. & Datei lässt sich nicht löschen

jonas.r

Mitglied
Hallo nochmal. Hab hier 2 kleine Probleme.

Problem Nr.1:
Ich habe ein Programm geschrieben, mit dem man seine zu erwartenden Stromkosten ausrechnen kann.
Auf dem Haupt-JFrame ist eine Liste mit Geräten, welche man hinzufügen, bearbeiten und löschen kann.
Wenn ich von diesem JFrame auf den Button "Neues Gerät hinzufügen" klicke, öffnet sich ein weiteres JFrame, in dem ich Name, Verbrauch und Laufzeit eines Gerätes in Textfelder eintragen kann. Beim klick auf einen "gerät speichern" button, erzeugt das Programm eine Textdatei und schreibt den Inhalt der Textfelder in sie rein.
Das alles funktioniert soweit bestens!

Der ActionListener, der zum "Gerät speichern" button gehört, führt neben der Erstellung der Datei, auch eine Methode "aktualisiereListe()" aus. Diese Methode befindet sich aber in der KLasse, in der sich auch das Hauptfenster befindet.
Ich erzeuge also eine neue Instanz der Hauptfenster-klasse und lass dann die Methode ausführen:
Java:
//Datei: NeuesGerätFenster.class

Hauptfenster hf = new Hauptfenster();
hf.aktualisiereListe();

Die Methode sieht wie folgt aus:
Java:
//Datei: Hauptfenster.class

public void aktualisiereListe(){
			leseVerzeichnisAus();	
			geräteListeJList.setListData(fileListOhneEndung);		
		}

Die Methode "leseVerzeichnisAus()" so:
Java:
//Datei: Hauptfenster.class

public void leseVerzeichnisAus(){
			//Verzeichnis auslesen:			
			 fileList = dir.list(new FilenameFilter() {					    
				public boolean accept(File d, String name) {
				return name.endsWith(".txt");
  				}
			 });
			 
			endungWeg();
		}

Nun aber öffnet sich das Haupt-JFrame (mit aktualisierter liste) nochmal! Nun hab ich also das alte Fenster und das neue!

Woran liegt das????:L


Problem Nr.2:
Außerdem lässt sich das nun erstellte Gerät nicht mehr löschen. Erst, wenn ich das Programm neu geöffnet habe. Ich habe auch versucht die Datei Manuell zu löschen, aber dann wird mir gesagt, dass das Programm sie gerade noch verwendet. Warum?

Hier die Methode zum Schreiben in eine Datei:
Java:
//Datei: DateiHandler.class

public void schreibeInDatei(String name, String verbrauch, String laufzeit, File f){
		
		FileWriter writer;
	    try {
			// new FileWriter(file ,true) - falls die Datei bereits existiert
	        // werden die Bytes an das Ende der Datei geschrieben	        
	        // new FileWriter(file) - falls die Datei bereits existiert
	        // wird diese überschrieben
	        writer = new FileWriter(f);
	        
	        // Text wird in den Strom geschrieben
	        writer.write(name.replaceAll(" ","_"));
	        writer.write(System.getProperty("line.separator"));    
	        writer.write(verbrauch);
	        writer.write(System.getProperty("line.separator"));
	        writer.write(laufzeit);
	        
	        //Der Strom wird übertragen und geschlossen
	        writer.flush();
	        writer.close();
	     }
	    catch (IOException e) {
	        e.printStackTrace();
	     }	    
	}

Ich würde mich sehr freuen, wenn ihr mir sagen könntet, was ich falsch gemacht habe=)

(Im Anhang hab ich das Programm als .jar File angehängt)
 

Anhänge

  • Stromkostenrechner.jar
    20,2 KB · Aufrufe: 6

Kevin94

Top Contributor
Ich hab leider für keines der Probleme eine Antwort, allerdings eine Anmerkungen.
Ganz am Anfang sei gesagt, das es sehr schwer dir zu helfen, wenn man nur diese Bruchstücke an Code vorgesetzt bekommt und in der .jar kein Source drin ist und man sich durch unkommentierten dekompilierten Code wühlen muss. Nebenbei: Ich bin zwar kein Verfechter der Umlaute-sind-böse Meinung, aber in Klassennahmen haben sie nichts zu suchen. Das kann dann doch mal böse enden.

Ausserdem konnte ich das erste Problem nicht nachstellen und den geposteten Code dazu nirgends in dem dekompilierten Code entdecken. Bei mir ergab sich nur das Problem, das die GUI nicht aktualisiert wurde.
Das zweite Problem hatte ich auch und den Grund dafür kann ich dir auch sagen, vermutlich ein nicht geschlossenen Stream, konnte ihn aber nirgends finden, liegt vermutlich an der Unübersichtlichkeit und dem Unwillen mehr als 10 min in die Suche zu stecken.

Dann ein paar allgemeine Anmerkungen:
Null-Layout, wirchlich? Ich hoffe du kannst einen GUI-Builder zu deiner Entschuldigung vorbringen. Wer tut sich denn sowas freiwillig an, es gibt doch genügend LayoutManager, die das einfacher und mit übersichtlicherem Code erledigen.
Das zweite ist
Code:
extends JFrame
. Dazu kann ich nur auf diesen Blogeintrag verlinken.
Dann die Art der Speicherung: Jedes Gerät als einzlene Datei zu speichern ist ja schon unelegant, ab das ganze noch hat codiert in einem Unterverzeichnis von C: wäre für mich als User definitiv ein Grund das Programm schnell wieder zu löschen. Du kannst genausogut alle Geräte in einer Datei speichern, erfordert beim Parsen etwas mehr Aufwand, ist aber auch schnell erledigt. Als alternative Speicherorte bietet sich
Code:
user.home
an.
Und zu letzt noch die Hauptklasse: Eine Klasse, in der nur die Main-Methode steht, in welcher nur eine einzige Anweisung steht, kann man sich auch sparen. Die Main-Methode hättest du genausogut auch in Hauptfenster stecken können.
 
L

Lissy

Gast
Hallo,
also ich bin mir nicht sicher, aber überprüfe mal ob du bei deinem JFrame die Methode

Java:
 f //Name deines JFrames*//.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

hast. Anders hat das rote Kreuz oben bei deinem Fenster keine Funktion (lässt sich also nicht schließen). Das ist bei Java so, wieso weiß ich auch nicht.
 

bERt0r

Top Contributor
Java:
Hauptfenster hf = new Hauptfenster();
Da ich wahnsinnig gut englisch, übersetzt ich mal für dich: new bedeutet neu. Wenn du dem Computer sagst neues Hauptfenster bitte, dann tut der das auch. Wenn du auf dein Hauptfenster zugreifen willst, musst du deinem zweiten Frame eine Referenz darauf übergeben, z.B mit
Java:
class EingabeFenster extends JFrame
{
       public EingabeFenster(Hauptfenster mamaFenster)
{
}
}
EingabeFenster fenster=new EingabeFenster(this);
 

jonas.r

Mitglied
[OT]Erstmal vorweg:
Es ist wirklich nett von dir, dass du dir die Mühe gemacht hast das Programm durchzugucken und sogar die .jar datei entpackt hast.
Wie du schreibst wirkt allerdings ziemlich genervt, weswegen ich etwas verwirrt bin. Ist doch immerhin ein Anfänger-Unterforum und da sind so "einfache" Fehler doch normal oder nicht?

Also ich habe versucht die Codeschnipsel aufs Wesentliche zu reduzieren, wenn das nicht reicht, hab ich überhaupt nichts dagegen, hier noch mehr davon, oder auch alles, mit in den Post einzubringen.

Mit dem Stream weiß ich nicht genau was du meinst. Meinst du den Datenstrom, der in die neu erstellte Datei fließt? Der wird doch mit
Code:
writer.close()
in der Methode
Code:
schreibeInDatei()
geschlossen, oder irre ich mich?
Und warum unterstellst du mir zu faul zu sein? Natürlich habe ich vorher lange Zeit nach einer Problemlöung gesucht, bevor ich jemand anderen um Hilfe frage!

Ich hab vorher schon viel mit Layout-Managern rumprobiert, aber das Ergebnis war für mich auf Grund von meiner unverständlichkeit nicht zufrieden stellend. Deswegen habe ich kein Layout Manager verwendet, sondern selber abhängigleiten beschrieben.

Das mit dem extends JFrame kannt ich bis jetzt nur so. (Wenn du die Antwort auf den Blogeintrag auch gelesen hast, solltest du wissen, dass es offt so gelehrt wird. So auch bei mir in der Schule.)

Alle weiteren Probleme, die dich ja anscheinend persönlich stören, sind auch nur auf Grund meines Unwissens als Anfänger vorhanden.

Dass es einen Befehl wie
Code:
user.home
gibt wusste ich bis jetzt nicht und habe deswegen das, was am meisten auf jeden Fall vorhanden ist (nämlich einfach C://) verwendet. Aber danke für den Tip, das fand ich auch nicht so Schick.
[/OT]

Zum Thema direkt:
Den Fehler des ersten Problems hab ich schon entdeckt. Beheben konnte ich ihn aber noch nicht.
In dem ActionListener öffne ich eine neue Instanz des Hauptfensters. Also macht er natürlich auch einen neuen Frame auf.

Das 2. Problem bleibt immernoch ungelöst, ich würde mich freuen, wenn mir jemand da noch helfen könnte.

Liebe Grüße

Edit: Während ich geschrieben habe, haben hier noch 2 weitere geantwortet, aber das hat sich mit meinem Post jetzt glaub ich auch erledigt ;)
 

Kevin94

Top Contributor
Mal vorneweg: Es war definitiv nicht meine Absich, schroff oder genervt zu klingen oder dir zu unterstellen das du faul bist.

Codeschnipsel: Die Menge an Code im Einganspost war eigentlich richtig, ich hätte es halt schön gefunden, wenn der richtige Quellcode auch in der .jar gewesen wäre.

Stream: Das ist der Englische Überbegriff für für Datenströme aller Art. In deinem Fall wären das FileWriter und der Scanner zum lesen (Denn muss man auch schliesen). Wenn ich mich nicht irre schliest du den nicht immer. Am einfachsten hat man die Kontrolle darüber, wenn man mit dem try-with-Resources Konstrukt das dem Compiler überlässt.

Das die angesprochenen Problem allein auf Unwissen und nicht auf Absicht basieren, habe ich nie bestritten. Genau dafür ist das Forum da: Solche Fehler anzusprechen.

Und
Code:
user.home
ist kein Befehl sondern eine System-Variable, die man über
Code:
System.getProperty("user.home")
abfragen kann.
 

jonas.r

Mitglied
Leider schließe ich den Scanner immmer, sofort nach verwendung ( mit scan.close()). Wär schön gewesen, wenn es das wäre. Ich benutze ihn zwei mal. Einmal beim auslesen aus den Dateien und einmal zum verändern der Daten. Der FileWriter wird auch geschlossen ( mit writer.close(), direkt nachdem der Strom gecshrieben wurde)

@Kevin94: Nebenbei: Das mit dem extends JFrame und der Main-Methode hab ich geändert:D
 

jonas.r

Mitglied
Kann niemand helfen?

Also das Problem nochmal in der Zusammenfassung:

-Ich erstelle eine Datei und schreibe einen Inhalt rein. Nach dem Schreiben mit einem FileWriter wird der writer sofort wieder mit dem Befehl
Code:
fileWriter.close();
geschlossen.
-Nun will ich diese Datei löschen, was aber nicht funktioniert. Erst nach ca. 40sek geht es dann.
-Auch das manuelle löschen aus dem Ordner wird solange von Windows blockiert.
-Andere Dateien kann ich mit dem Programm löschen, wenn sie bei dem letzten Ausführen des Programmes erstellt, oder ihre erstellung ca 40 sek her ist.

Die Methode zum Erstell der Datei geht so:
Java:
//Datei: DateiHandler.class

public void macheDatei(File f){

	      
	    if (!f.exists()){
			try {
				new Formatter(f);   					
			} 
			catch (FileNotFoundException e) {
				e.printStackTrace();
			}
	    }
	}

Die Methode zum schreiben geht so:
Java:
//Datei: DateiHandler.class

public void schreibeInDatei(String name, String verbrauch, String laufzeit, File f){
		
		FileWriter writer;
	    try {
			// new FileWriter(file ,true) - falls die Datei bereits existiert
	        // werden die Bytes an das Ende der Datei geschrieben	        
	        // new FileWriter(file) - falls die Datei bereits existiert
	        // wird diese überschrieben
	        writer = new FileWriter(f);
	        
	        // Text wird in den Strom geschrieben
	        writer.write(name.replaceAll(" ","_"));
	        writer.write(System.getProperty("line.separator"));    
	        writer.write(verbrauch);
	        writer.write(System.getProperty("line.separator"));
	        writer.write(laufzeit);
	        
	        //Der Strom wird übertragen und geschlossen
	        writer.flush();
	        writer.close();
	     }
	    catch (IOException e) {
	        e.printStackTrace();
	     }	    
	}

Die Methode zum löschen funktioniert an sich ja, deswegen lass ich die raus.

Die Methode in dem ActionListener zum speichern der Datei sieht so aus:
Java:
//Datei: NeuesGerätFenster.class

class ErzeugeGerätListener implements ActionListener{
	
		public void actionPerformed(ActionEvent e) {
			String eingabeName= eingabeNameJtext.getText();
			File f = new File (dir+"//" + eingabeName +".txt");
			DateiHandler dh= new DateiHandler();
			dh.macheDatei(f);
			dh.schreibeInDatei(eingabeNameJtext.getText(), eingabeVerbrauchJText.getText(), eingabeLaufzeitJtext.getText(), f);
			
			Hauptfenster hauptFenster = Hauptfenster.hauptFenster;
			hauptFenster.aktualisiereListe();
			frame.dispose();
		}
	}


Weiß jemand was ich falsch mache?
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
J Spiel mit Button klick starten Java Basics - Anfänger-Themen 9
J Button klick bei eine bestimmten Zahl Java Basics - Anfänger-Themen 8
P Auf Button-Klick außerhalb der GUI-Klasse reagieren Java Basics - Anfänger-Themen 10
D Durch Button klick wert in JTextField einfügen Java Basics - Anfänger-Themen 5
thorr Ereignis bei Klick auf Button Java Basics - Anfänger-Themen 3
C Button einfärben bei Klick Java Basics - Anfänger-Themen 5
T Per Button Klick Fenster schließen?< Java Basics - Anfänger-Themen 7
B klick auf einen Button zählen Java Basics - Anfänger-Themen 3
R auf button klick befehl ausführen Java Basics - Anfänger-Themen 11
G zelle(n) makieren, button klick, Zelle(n) farbig Java Basics - Anfänger-Themen 4
M JTable - DefaultTableModel - neue Row per Button-Klick Java Basics - Anfänger-Themen 2
M jToggleButton Klick abfangen ohne den Button zu deaktivieren Java Basics - Anfänger-Themen 2
P Button deaktivieren bei Klick auf einen anderen Button? Java Basics - Anfänger-Themen 5
L Button-Klick Java Basics - Anfänger-Themen 9
T Klick auf Button Java Basics - Anfänger-Themen 7
G Fenster schließen bei Klick auf Button Java Basics - Anfänger-Themen 4
R NullPointerException beim Klick auf Button Java Basics - Anfänger-Themen 3
M Help! ActionEvent bei Button Klick Java Basics - Anfänger-Themen 9
F JDialog per Button-Klick schliessen Java Basics - Anfänger-Themen 2
L Bei Klick auf einen Button reagieren - Wahrer Anfänger! Java Basics - Anfänger-Themen 3
N Nach Button klick zeichnen Java Basics - Anfänger-Themen 6
richis-fragen Mausrad logitech kann links und rechts klick wie in java abragen. Java Basics - Anfänger-Themen 15
J Jtable Eingabe nach Klick ausserhalb der Tabelle übernehmen Java Basics - Anfänger-Themen 6
E JAvaFX: Verschiedene Panels nach Klick auf Node des TreeView anzeigen Java Basics - Anfänger-Themen 0
F Per Klick Klasse ausführen Java Basics - Anfänger-Themen 4
T Bei Buttonklick Aktion starten, nach erneutem Klick beenden Java Basics - Anfänger-Themen 4
G jButton bei Klick String +1 Java Basics - Anfänger-Themen 5
0 Nach Klick auf minimieren nur ins Tray Java Basics - Anfänger-Themen 3
JAVAnnik Klick auf Bildschirm Java Basics - Anfänger-Themen 11
JAVAnnik variable erhöhen bei Klick auf JLabel Java Basics - Anfänger-Themen 3
D JOptionPane ohne Klick-Aufforderung Java Basics - Anfänger-Themen 9
X Per Klick ein Dialogfenster öffnen Java Basics - Anfänger-Themen 18
J JList Inhalt nach JButton Klick aktualisieren Java Basics - Anfänger-Themen 8
M slide effekt über page legen per klick(href) Java Basics - Anfänger-Themen 5
J Klick auf Icon eines Labels registrieren. Java Basics - Anfänger-Themen 4
R .Jpg anzeigen lassen nach klick in JList Java Basics - Anfänger-Themen 11
H2SO3- dreieck, bild --> maus klick event. Wie gehts? Java Basics - Anfänger-Themen 10
S Neuladen der Webseite nach Klick im Applet Java Basics - Anfänger-Themen 2
G JFrame bei Klick auf X WIndow nicht schließen Java Basics - Anfänger-Themen 2
S jList Multiple Selection mit Klick Java Basics - Anfänger-Themen 2
J Klick der ein Javascript ausfuehrt simulieren? Java Basics - Anfänger-Themen 2
C Bild in JTable verändern (nach einem Klick auf Zelle) Java Basics - Anfänger-Themen 4
1 Checkbox nach klick ausblenden Java Basics - Anfänger-Themen 4
Z klick zähler Java Basics - Anfänger-Themen 2
E Farbänderung des Frames bei Klick . Java Basics - Anfänger-Themen 7
S GUI "Klick-Tabellen", MouseOver Effekte und 2D-Arr Java Basics - Anfänger-Themen 11
G Aktionen auslösen, nach Klick auf "Blätter" eines Java Basics - Anfänger-Themen 2
Maxq Klassen Actionen in Button implementieren Java Basics - Anfänger-Themen 6
B Wie kann ich folgende Klasse/Methode per Button ausführen? Java Basics - Anfänger-Themen 1
JavaBeginner22 Button Text verändern Java Basics - Anfänger-Themen 1
sserio Java Fx, wie erstellt man einen EventHandler, der durch das Drücken eines Button Texte in eine Table view einfügt Java Basics - Anfänger-Themen 17
Schniffi Nur bestimmte Bilder aus einem Array auf Image Button anzeigen lassen Java Basics - Anfänger-Themen 3
M Problem mit Klassenverständnis und Button Java Basics - Anfänger-Themen 8
B Zurück Button erstellen Java Basics - Anfänger-Themen 1
Tom/S Button info Java Basics - Anfänger-Themen 2
I Exception bei Button mit wait() und notifyAll() Java Basics - Anfänger-Themen 3
T JSP, Button-Color change. Java Basics - Anfänger-Themen 1
L hilfe run button funktioniert nicht Java Basics - Anfänger-Themen 13
S Erste Schritte Button einen Wert zuweisen & diesen ausgeben Java Basics - Anfänger-Themen 2
S Counter Label Button Java Basics - Anfänger-Themen 4
J Button über Pfeiltasten bewegen Java Basics - Anfänger-Themen 8
J Button als Feld nutzen Java Basics - Anfänger-Themen 17
A JOPtionPaneOptionDialog Abfrage welcher Button gedrückt wurde? Java Basics - Anfänger-Themen 8
J JavaFX Label,Button zur Laufzeit Java Basics - Anfänger-Themen 30
B Button soll sowohl auf Klicken als auch auf die Enter-Taste reagieren Java Basics - Anfänger-Themen 9
S Klassenaufruf über JFrame Button Java Basics - Anfänger-Themen 3
G JTextField per Button speichern und an andere Klasse übergeben Java Basics - Anfänger-Themen 2
X TextField-Inhalt mit Button in .txt-Datei speichern Java Basics - Anfänger-Themen 16
S JFrame mit Hintergrundbild und Button Java Basics - Anfänger-Themen 4
P Upload Button funktioniert nicht Java Basics - Anfänger-Themen 13
I Ordnung JLayeredPane mit Button ändern Java Basics - Anfänger-Themen 5
A JLabel mit button drücken verändern Java Basics - Anfänger-Themen 6
H Swing Button hat falsche Größe Java Basics - Anfänger-Themen 5
CptK mit javafx button erstellen Java Basics - Anfänger-Themen 1
AppGuruCode962 Button mit Textfield verbinden Java Basics - Anfänger-Themen 13
L Java gui reset button Fehler!? Java Basics - Anfänger-Themen 2
L Java reset button Problem Java Basics - Anfänger-Themen 3
L Java reset button Problem Java Basics - Anfänger-Themen 9
L Erste Schritte AndroidStudio Button - Nur Großbuchstaben Java Basics - Anfänger-Themen 2
V JAVA Button Java Basics - Anfänger-Themen 4
M Listener für Button - Wert von Variablen verändern Java Basics - Anfänger-Themen 14
S OOP Button erst nach 2x klicken deaktivieren Java Basics - Anfänger-Themen 4
J Button in anderer Klasse ändern Java Basics - Anfänger-Themen 3
A Fenster mit Button aufrufen Java Basics - Anfänger-Themen 3
V Button/Event wird nicht ausgeführt, was tun? Java Basics - Anfänger-Themen 2
J Bild in Button einsetzen Java Basics - Anfänger-Themen 6
S button kommt durch bild Java Basics - Anfänger-Themen 13
I GUI Button Postition festlegen Java Basics - Anfänger-Themen 4
Tacofan Welcher Button wurde zuerst gedrückt? Java Basics - Anfänger-Themen 4
K Interface Fenster mit 3 ComboBoxen und 1 Button Java Basics - Anfänger-Themen 13
J Best Practice Button isPressed o.ä. auswerten Java Basics - Anfänger-Themen 10
S zahl hoch und runter zählen per button Java Basics - Anfänger-Themen 25
G Email-sending Button Java Basics - Anfänger-Themen 9
K Input/Output JCheckBox mit Bestätigungs-Button Java Basics - Anfänger-Themen 22
A Nach Druck eines Buttons reagieren andere Button nicht Java Basics - Anfänger-Themen 3
C Ein Button soll Focus rausfinden und Methode starten Java Basics - Anfänger-Themen 9
S mit Java HTML Button drücken "lassen" Java Basics - Anfänger-Themen 8
GadgetSofa jComboBox mit dem Button verbinden. Aber wie?? Java Basics - Anfänger-Themen 4
R Button soll Wert 1 in Variable schreiben Java Basics - Anfänger-Themen 4
D Zurück Button -- Background wird nicht angezeigt Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben