# FileDialog/ JFileChooser, Bilder laden, Dateifilter, Diashow



## Spaceangel (22. Okt 2005)

Hallo,

habe ein Menü (File -> New) gebastelt und will nun, dass, wenn ich auf "new" klicke sich ein Dialog öffnet wo ich mehrere Dateien auswählen  kann (jpg oder jpeg).

habe dazu folgendes versucht:


```
public class newActionClass extends AbstractAction{
 publich newActionClass(String text, KeyStroke shortcut) {
  super(text);
  puValue(ACELERATOR_KEY, shortcut);
 }
 public void actionPerformed(ActionEvent e){
  
  FileDialog dlg = new FileDialog(new Frame(), "choose files");
   dlg.setMode(FileDialog.LOAD);
   dlg.setVisible(true);
 }
}
```

jedoch passiert nichts wenn ich auf "neu" klicke. Wo kann der Fehler liegen?

einen Listener habe ich wie folgt angebunden.


```
miNew = new MenuItem (resbundle.getString("..."));
miNew.setShourtcut(...);
fileMenu.add(miNew).setEnable(true);
miNew.addActionListener(newAction);
```

Wäre super wenn mir jemand helfen könnte.

Danke und viel Grüße,
Steffen


----------



## L-ectron-X (22. Okt 2005)

Wie man aus einem Frame heraus über ein Menü ein Datei-Dialog öffnet (AWT):


```
import java.awt.*;
import java.awt.event.*;

public class MyFrame extends Frame {
   private FileDialog fileDialog;
   private Menu fileMenu;
   private MenuItem fileMenuItem, exitMenuItem;
   private MenuBar menuBar;

   public MyFrame(String title) {
      super(title);
      setSize(600, 400);
      setLocationRelativeTo(null);
      addWindowListener(new WindowAdapter() {
         public void windowClosing(WindowEvent e) {
            exit();
         }
      });
      
      fileDialog = new FileDialog(this, "choose files", FileDialog.LOAD);
      menuBar = new MenuBar();
      fileMenu = new Menu("File");
      menuBar.add(fileMenu);
      fileMenuItem = new MenuItem("Open");
      fileMenu.add(fileMenuItem);
      fileMenuItem.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            openFileDialog();
         }
      });
      exitMenuItem = new MenuItem("Exit");
      exitMenuItem.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            exit();
         }
      });
      fileMenu.add(exitMenuItem);
      setMenuBar(menuBar);
      
   }
   
   private void openFileDialog() {
      fileDialog.setVisible(true);
   }
   
   private void exit() {
      System.exit(0);
   }
   
   public static void main(String[] args) {
      new MyFrame("MyFrame").setVisible(true);
   }

}
```

Es sind noch Dinge wie, ein Dateifilter und die Verarbeitung der ausgewählten Datei(en) zu implementieren.
Einen fertig implementierten Dateifilter findest du hier: http://www.java-forum.org/allgemeine-java-themen/20863-nur-javabeans-laden-dateifilter.html
Es sind dann sicher noch Anpassungen fällig.


----------



## Spaceangel (23. Okt 2005)

Hallo,
ich habe das alles mal versucht einzubauen und auch nur so zu verwenden, aber leider passiert jetzt gar nichts mehr. Ich bekomme eine Fehlermeldung das eien "Exception" aufgetreten ist aber mehr nicht. Es wird nur kurz das Fenster angezeigt, da kann ich OK anklicken und das wars. 

Ich habe nicht wirklich Ahnung von Java (OOP Prinzipien sind mir bekannt und versteh ich auch - aber Java?!? :autsch: )

Was ich genau machen will ist, das ich eine bestimmte Anzahl von Bilder (JPG) einlesen will aus einem gewählten Verzeichnis und dann diese zusammensetzen möchte (nur immer die mittelste vertikale Pixellinie).

Dann soll das Bild gespeichert werden. Sind im Normalfall 720 Bilder.

Wie kann ich da in Java überhaupt den Ansatz finden das ich so etwas programmieren kann?


Danke, Steffen.


----------



## MPW (23. Okt 2005)

Der Ansatz ist gut, nimm' nur besser swing:

Die groben Schritte:

du erzeugst eine Instanz und rufst in dieser die Methode zum Zeigen auf, den Returnwert fängst du am Besten als int auf.

Dann kannst du prüfen, ob Abbrechne oder OK geklickt wurde, und dann kriegt man noch die Dateien irgendwie raus...kenne gerade die Methoden nicht...guckst'e inne API!


----------



## L-ectron-X (23. Okt 2005)

So, hier mal ein ganz einfacher Bildbetrachter mit Diashow in Swing (mit Dateifilter für einige Grafikformate), welcher dir demonstrieren kann, wie man einen Dateiauswahldialog öffnen und Grafikdateien anzeigen kann.
Um den Bildbetrachter einfach zu halten, habe ich hier bewusst auf die Verwendung einer Collection-Datenstruktur verzichtet.

Klasse Bildbetrachter (allgemeines Benutzer-Interface)

```
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.io.*;

public class Bildbetrachter extends JFrame implements Diashow {
   private JPanel p_btnPanel, p_picturePanel;
   private JButton btn_choose;
   private JButton btn_back;
   private JButton btn_next;
   private JButton btn_diashow;
   private JLabel l_picture, l_name;
   private JFileChooser chooser;
   private File[] pictures;
   private int index;
   private Timer timer;

   public Bildbetrachter(String title) {
      super(title);

      setSize(780, 585);
      setLocationRelativeTo(null);
      setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

      Container content = getContentPane(); //Für Java-Versionen unter 1.5

      l_name = new JLabel("Dateiname: ");

      p_btnPanel = new JPanel(new GridLayout(1, 3));

      //mit einem GridLayout könnten hier mehrere Bilder gleichzeitig angezeigt werden
      p_picturePanel = new JPanel(new BorderLayout());

      l_picture = new JLabel();
      l_picture.setHorizontalAlignment((int)JLabel.CENTER_ALIGNMENT);
      p_picturePanel.add(l_picture);

      btn_choose = new JButton("Bilder auswählen");
      btn_choose.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            btn_chooseClicked();
         }
      });
      p_btnPanel.add(btn_choose);

      btn_back = new JButton("<  Voriges Bild");
      btn_back.setEnabled(false);
      btn_back.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            btn_backClicked();
         }
      });
      p_btnPanel.add(btn_back);

      btn_next = new JButton("Nächstes Bild  >");
      btn_next.setEnabled(false);
      btn_next.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            btn_nextClicked();
         }
      });
      p_btnPanel.add(btn_next);
      
      btn_diashow = new JButton("Diashow");
      btn_diashow.setEnabled(false);
      btn_diashow.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            if(e.getActionCommand().equals("Diashow")) {
               startDiashow();
            }
            else if(e.getActionCommand().equals("Stopp")) {
               stopDiashow();
            }

         }
      });
      p_btnPanel.add(btn_diashow);

      content.add(l_name, BorderLayout.NORTH);
      content.add(new JScrollPane(p_picturePanel), BorderLayout.CENTER);
      content.add(p_btnPanel, BorderLayout.SOUTH);

      chooser = new JFileChooser();
      chooser.addChoosableFileFilter(new DateiFilter());
      chooser.setMultiSelectionEnabled(true); //Auswahl mehrerer Dateien erlauben
   }
   
   //Überschreibt Methode von Diashow
   public void nextPicture() {
      btn_nextClicked();
   }

   //FileChooser anzeigen, Dateien auswählen, erstes Bild anzeigen
   private void btn_chooseClicked() {
      int result = chooser.showDialog(this, "Auswählen");
      switch(result) {
         case JFileChooser.APPROVE_OPTION:
            pictures = chooser.getSelectedFiles();
            if(pictures == null) {
              return;
            }
            btn_next.setEnabled(true);
            btn_back.setEnabled(true);
            btn_diashow.setEnabled(true);
            index = 0;
            l_picture.setIcon(new ImageIcon(pictures[index].getAbsolutePath()));
            l_name.setText("Dateiname: "+pictures[index].getName());
      }
   }

   //voriges Bild anzeigen
   private void btn_backClicked() {
      index--;
      if(index < 0) {
         index = pictures.length-1;
      }
      l_picture.setIcon(new ImageIcon(pictures[index].getAbsolutePath()));
      l_name.setText("Dateiname: "+pictures[index].getName());
   }

   //nächstes Bild anzeigen
   private void btn_nextClicked() {
      index++;
      if(index > pictures.length-1) {
         index = 0;
      }
      l_picture.setIcon(new ImageIcon(pictures[index].getAbsolutePath()));
      l_name.setText("Dateiname: "+pictures[index].getName());
   }
   
   //Diashow starten
   private void startDiashow() {
      timer = new Timer(this, 5000);  //Wartezeit 5s
      timer.start();
      btn_diashow.setText("Stopp");
   }
   
   //Diashow stoppen
   private void stopDiashow() {
      timer.interrupt();
      btn_diashow.setText("Diashow");
   }

   //innere Klasse, realisiert einen Dateifilter für Standard-Grafikdateien
   class DateiFilter extends javax.swing.filechooser.FileFilter {
      public String getDescription() {
         return "Grafikdateien (*.gif, *.jpg, *.png)";
      }

      public boolean accept(File file) {
         if(file.isDirectory())
            return true;
         else if(file.getName().endsWith(".gif"))
            return true;
         else if(file.getName().endsWith(".jpg"))
            return true;
         else if(file.getName().endsWith(".png"))
            return true;
         else
            return false;
      }
   }

   public static void main(String[] args) {
      new Bildbetrachter("Einfacher Bildbetrachter").setVisible(true);
   }
}
```

Interface Diashow

```
public interface Diashow {
  public void nextPicture();
}
```

Klasse Timer

```
public class Timer extends Thread {
  private Diashow show;
  private long wait;
  
  public Timer(Diashow show, long wait) {
    this.show = show;
    this.wait = wait;
  }
  
  public void run() {
    while(!isInterrupted()) {
      try {
        Thread.sleep(wait);
        show.nextPicture();
      }
      catch(InterruptedException e) {
        interrupt();
      }
    }
  }
}
```

_L-ectron-X hat diesen Beitrag editiert am 19.02.2006 um 15:48 Uhr.
Code um eine Diashow erweitert._


----------



## Guest (1. Dez 2006)

Hm, bei mir geht nur das laden des ersten Bildes, next oder back funktionieren nicht.

Wenn ich einen System.out in die next Methode setze ist index auch immer 0 .


----------



## Guest (1. Dez 2006)

Sorry, war ein Bedienfehler. Man muss mehrere Dateien selektieren. Dachte das geht wie bei Irfan View.
Danke, funktioniert!   :toll:


----------



## Mike01 (26. Jan 2008)

Hi,

das Beispiel ist toll. Hab aber eine kleine Frage.


```
dateiname.setText("Dateiname: "+datei.getName());
```

Mit diesen Code kann man sich ja den DateiNamen des Bildes ausgeben lassen. Wie muss in den Code erweitern
um mir auch die größe und breite eines Bildes anzeigen zu lassen ?


----------



## L-ectron-X (1. Feb 2008)

Was meinst du mit "größe"? Die Dimensionen oder die Dateilänge?
Die Breite kannst du mit getWidth() ermitteln.


----------

