JFileChooser löschen

K3rn

Mitglied
Hallo,

in meinem jetzigem Projekt habe ich ua einen Menüpunkt, der sich "Löschen" nennt. hierzu soll ein File gelöscht werden können, welche die Endung "*.fttm" hat (diese Datein werden von dem Programm gespeichert). Jetzt hab ich hier den ActionListener für den Button, mit den FileFilter etc:

Code:
             JFileChooser filechooser=new JFileChooser();
             /*Filter einbauen (für .fttm-Datein)*/
              filechooser.setFileFilter(new FileFilter(){ 
                  public boolean accept(File f){ 
                    return f.isDirectory()||f.getName().toLowerCase().endsWith( ".fttm" ); 
                  } 
                  public String getDescription(){ 
                    return "*.fttm";
                  } 
               });
             /*FileChooser benutzen (Buttons festlegen)*/
              int stat=filechooser.showDialog(null,"Löschen");
              while(stat!=JFileChooser.CANCEL_OPTION){
                  if(stat==JFileChooser.APPROVE_OPTION){
                      File f=filechooser.getSelectedFile();
                      f.delete();
                   }
             }

Wenn ich jetzt ein File lösche, verschwindet der ganze Dialog und es funktioniert auch (das Löschen) ABER mein Hauptfenster, das den Menüeintrag "Löschen" hat reagiert jetzt nicht mehr.

Über eine Lösung würde ich mich sehr freuen, da ich auf die Funktion nicht verzichten will aber selbst keine habe.

MfG,
k3rn
 
Zeig mal bitte ein wenig mehr Code.
Und prüfe ob es nicht zufällig in ner Endlosschleife landen kann.
 
das ist das ganze fenster:

Code:
package fttm_mk;

import java.awt.Image;
import java.awt.MediaTracker;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import java.io.File;

import javax.swing.filechooser.FileFilter;

public class FTTM_Frame extends JFrame implements ActionListener{
    public FTTM_Frame(int sizeX,int sizeY,int locX,int locY,String title) {
        /*Position festlegen*/
        this.setLocation(locX,locY);
        /*Größe festlegen*/
        this.setSize(sizeX,sizeY);
        /*Titel setzen*/
        this.setTitle(title);
        /*Icon des Fensters festlegen*/
        Image img = getToolkit().getImage("icon.png");
        MediaTracker mt = new MediaTracker(this);
        mt.addImage(img, 0);
        try{
            //Warten, bis das Image vollständig geladen ist,
            mt.waitForAll();
        }catch (InterruptedException e){
            //nothing
        }
        this.setIconImage(img);
        /*Menü erstellen*/
        JMenuBar menubar=new JMenuBar();
        JMenu datei=new JMenu("Datei");
        JMenu option=new JMenu("Optionen");
        JMenu hilfe=new JMenu("Hilfe");
        menubar.add(datei);
        menubar.add(option);
        menubar.add(hilfe);
        /*Datei (Eintrag erstellen, Shortcut festlegen, ActionCommand festlegen, ActionListener hinzufügen)*/
        JMenuItem oeffnen=new JMenuItem("Öffnen",'f');
        oeffnen.setActionCommand("oeffnen");
        oeffnen.addActionListener(this);
        JMenuItem speichern=new JMenuItem("Speichern",'s');
        speichern.setActionCommand("speichern");
        speichern.addActionListener(this);
        JMenuItem loeschen=new JMenuItem("Löschen",'l');
        loeschen.setActionCommand("loeschen");
        loeschen.addActionListener(this);
        JMenuItem neues_train=new JMenuItem("Neues Trainig",'n');
        neues_train.setActionCommand("neues_train");
        neues_train.addActionListener(this);
        JMenuItem modus=new JMenuItem("Modus wechseln",'m');
        modus.setActionCommand("modus");
        modus.addActionListener(this);
        JMenuItem beenden=new JMenuItem("Beenden",'b');
        beenden.setActionCommand("beenden");
        beenden.addActionListener(this);
        datei.add(oeffnen);
        datei.add(speichern);
        datei.add(loeschen);
        datei.add(neues_train);
        datei.add(modus);
        datei.addSeparator();
        datei.add(beenden);
        /*Optionen*/
        JMenuItem ende=new JMenuItem("Trainingsende",'e');
        ende.setActionCommand("ende");
        ende.addActionListener(this);
        JMenuItem resumee_train=new JMenuItem("Trainingsresümee",'r');
        resumee_train.setActionCommand("resumee_train");
        resumee_train.addActionListener(this);
        JMenuItem resumee_jahr=new JMenuItem("Jahresresümee",'j');
        resumee_jahr.setActionCommand("resumee_jahr");
        resumee_jahr.addActionListener(this);
        option.add(ende);
        option.add(resumee_train);
        option.addSeparator();
        option.add(resumee_jahr);
        /*Hilfe*/
        JMenuItem hilfe_item=new JMenuItem("Hilfe",'h');
        hilfe_item.setActionCommand("hilfe_item");
        hilfe_item.addActionListener(this);
        JMenuItem ueber=new JMenuItem("Über",'b');
        ueber.setActionCommand("ueber");
        ueber.addActionListener(this);
        hilfe.add(hilfe_item);
        hilfe.add(ueber);
        this.setJMenuBar(menubar);         
    }
    /*Methoden*/
    public void actionPerformed(ActionEvent event) {
        String com=event.getActionCommand();
        if(com=="beenden"){
            /*Beenden mit Dialog*/
            int exit=JOptionPane.showConfirmDialog(null,"Möchten Sie wirklich beenden?");
            if(exit==JOptionPane.YES_OPTION)
                System.exit(0);
        }else if(com=="oeffnen"){
            /*Altes Training öffnen*/
            
        }else if(com=="speichern"){
            /*Training (Tabelle) speichern*/
            
        }else if(com=="loeschen"){
            /*Vorhandenes Training löschen*/
             JFileChooser filechooser=new JFileChooser();
             /*Filter einbauen (für .fttm-Datein)*/
              filechooser.setFileFilter(new FileFilter(){ 
                  public boolean accept(File f){ 
                    return f.isDirectory()||f.getName().toLowerCase().endsWith( ".fttm" ); 
                  } 
                  public String getDescription(){ 
                    return "*.fttm";
                  } 
               });
             /*FileChooser benutzen (Buttons festlegen)*/
              int stat=filechooser.showDialog(null,"Löschen");
              while(stat!=JFileChooser.CANCEL_OPTION){
                  if(stat==JFileChooser.APPROVE_OPTION){
                      File f=filechooser.getSelectedFile();
                      /*@DENIS: VORHER FRAGEN OB MAN WIKRLICH LÖSCHEN WILL?*/
                      f.delete();
                      /*FENSTER REAGIERT ZZ NOCH NICHT NACH DEM LÖSCHEN*/
                  }
             }
        }else if(com=="neues_train"){
            /*Neues Training beginnen*/
            
        }else if(com=="modus"){
            /*Modus wechseln            RIPPATHA ÜBERPRÜFEN (ob das so machbar ist!)!*/              
             FTTM_StartModi startModi=new FTTM_StartModi();
             this.dispose();
        }else if(com=="ende"){
            /*Training beenden*/
            
        }else if(com=="resumee_train"){
            /*Trainingsresümee anzeigen*/
            
        }else if(com=="resumee_jahr"){
            /*Jahresresümee anzeigen*/
            
        }else if(com=="hilfe_item"){
            /*Hilfe zum Programm 
             *WICHTIG: HTML-BENUTZEN!*/
             FTTM_HilfsFrame hilfe_seite=new FTTM_HilfsFrame(400,400,"Hilfe");
             JLabel text=new JLabel
             ("<html>\n" + 
             "	<body>\n" + 
             "		<p>Hier entsteht die Hilfe zum Programm</p>\n" + 
             "	</body>\n" + 
             "</html>");
             hilfe_seite.add(text);
             hilfe_seite.setVisible(true);
        }else if(com=="ueber"){
            /*Über-Seite anzeigen (Team-Seite) 
             *WICHTIG: HTML-BENUTZEN!*/
             FTTM_HilfsFrame ueber_seite=new FTTM_HilfsFrame(400,400,"Über");
            JLabel text=new JLabel
            ("<html>\n" + 
            "	<body>\n" + 
            "		<p>Dieses Programm wurde von folgenden Personen bereitgestellt:</p>\n" + 
            "		<ul>\n" + 
            "			<li>Denis Schützenhofer</li>\n" + 
            "			<li>Christian Rippatha</li>\n" + 
            "			<li>Matthias Kern</li>\n" + 
            "		</ul>\n" + 
            "	</body>\n" + 
            "</html>");
            ueber_seite.add(text);
            ueber_seite.setVisible(true);
        }
    }
}

ich glaub nicht das es in einer endlosschleife endet, weil er ja schon beim löschen von dem file den filechooser schließt, obwohl er das nicht sollte (weil da ja eine schleife läuft bis man auf abbrechen drückt)

mfg
 
Wie ich schon sagte.
Es ist außerdem keine so gute Idee nacheinander eine Variable auf 2 verschiedene Werte zu prüfen, wenn sie dazwischen nicht geändert werden.
 
ich kapier nicht was du meinst, wie soll ich den sonst abprüfen welcher button gedrückt wurde

außerdem gehts mir hier nicht um meinen programmierstil sondern um den filechooser ^^
 
Hi,
Java:
              while(stat!=JFileChooser.CANCEL_OPTION){
                  if(stat==JFileChooser.APPROVE_OPTION){
                      File f=filechooser.getSelectedFile();
                      /*@DENIS: VORHER FRAGEN OB MAN WIKRLICH LÖSCHEN WILL?*/
                      f.delete();
                      /*FENSTER REAGIERT ZZ NOCH NICHT NACH DEM LÖSCHEN*/
                  }
             }
Dieser Abschnitt kommt mir sehr verdächtig vor. Hast du diesen Abschnitt schon mal debuggt?
Ich vermute, dass das einfach an der Schleife liegt.

Desweiteren finde ich es keine so gute Idee, den Befehl so abzufragen, wie du es machst. (Wie Kai schon sagte). Stattdessen könnte man ja gleich switch nehmen, und dann macht man immer einen Fehler.
Ich mache das in solchen Fällen so:
1. Ich schreibe für alle Komponenten Unterklassen, die sich im Konstruktor selbst modifizieren, dazu ist ein Konstruktor schließlich da. Auch (Action)Listener werden hier hinzugefügt.
2. In der Form schreibe ich nur: add(new MyOkButton()). Dadruch wird der Code übersichtlicher.
3. Ich programmiere mir eine Schnittstelle mit den Methoden des Hauptframes, die die Komponenten aufrufen sollen. Das Hauptframe implementiert diese Schnittstelle natürlich.
4. Ich übergebe im Konstruktor das Hauptframe, das die Komponente allerdings als ebendiese Schnittstelle speichert.

Ist ein bisschen kompliziert, aber es vereinfacht deinen Code.
 
Kannst du eh so. Wobei ich meistens einfach prüfe ob das SelectedFile 'null' ist.
Aber es bringt afaik nichts eine Variable in der while abzufragen, die sich nicht ändert. Und damit meinte ich nicht einen schlechten Stil, sondern einfach dass es sinnlos ist da immer nur eines ausgeführt wird.
Na ja, hab mir deinen Source nur flüchtig durchgeschaut, ausgeführt, File gelöscht, im taskmgr geschaut.
 
@Kai008: Nur prüfen ob das selectedFile nicht null ist, ist aber nicht korrekt. Denn wenn man ein File auswählt und dann auf Cancel drückt, würdest du die Aktion trotzdem ausführen.

@K3rn: Lass die while-Schleife weg. Dadurch läuft dein Programm Endlos in dieser Schleife weil wenn du auf OK klickst stat nicht gleich Cancel ist.
 
Hallo

Danke für eure Hilfe, hab erst jetzt kapiert was Kai gemeint hat. Jetzt funktionierts natürlich, der Code sieht jetzt so aus:

Code:
else if(com=="loeschen"){
            /*Vorhandenes Training löschen*/
             JFileChooser filechooser=new JFileChooser();
             /*Filter einbauen (für .fttm-Datein)*/
              filechooser.setFileFilter(new FileFilter(){ 
                  public boolean accept(File f){ 
                    return f.isDirectory()||f.getName().toLowerCase().endsWith( ".fttm" ); 
                  } 
                  public String getDescription(){ 
                    return "*.fttm";
                  } 
               });
             /*FileChooser benutzen (Buttons festlegen)*/
              int stat=filechooser.showDialog(null,"Löschen");
              while(stat!=JFileChooser.CANCEL_OPTION){
                  if(stat==JFileChooser.APPROVE_OPTION){
                      File f=filechooser.getSelectedFile();
                      /*@DENIS: VORHER FRAGEN OB MAN WIKRLICH LÖSCHEN WILL?*/
                      if(f!=null)
                        f.delete();
                  }
                 stat=filechooser.showDialog(null,"Löschen");
             }

Danke für eure Hilfe!! Jetzt kann ich mich um den nächsten Menüpunkt kümmern ^^

MfG,
k3rn
 
Moin,

das ist aber ein uriges Pflaster ..... :rolleyes:
Ich denke, dass die while-Schleife völlig überflüssig ist !!

Code:
/* FileChooser benutzen (Buttons festlegen) */
int stat=filechooser.showDialog(null,"Löschen");
while(stat!=JFileChooser.CANCEL_OPTION)
{
    if(stat==JFileChooser.APPROVE_OPTION)
    {
            File f=filechooser.getSelectedFile();
            f.delete();
        }
}

Sobald im Chooser eine Option gewählt wurde, hat der Chooser halt diesen Wert (entweder CANCEL... oder APPROVE....).
Dadurch, dass die Datei gelöscht wird, ändert sich dies ja nicht!
Also solltest Du, wie schon zuvor erwähnt, besser auf beide Zustände parallel reagieren
wenn APPROVE... -> löschen
wenn CANCEL... ->abbrechen

Alles andere ist ziemlicher Humbug und wird mit Sicherheit irgendwann zu Problemen führen !

Wozu eine while-Schleife, wenn Du deren Bedingung am Ende des ersten Durchlaufs sowieso "killst"? ? ?

Gruß
Klaus
 

Neue Beiträge

Zurück