# Per ComboBox Dateien einlesen



## kenux (17. Jun 2009)

Hallo,

ich möchte ein Swing-programm schreiben mit folgenden Funktionen:

das Programm beinhaltet eine ComboBox, mit der man Dateien aus dem aktuellen Verzeichnis auswählen kann. Die Dateien sollen im ComboBox alphabetisch geordnet sein.
Nach dem anklicken auf einen Dateinamen, soll die Datei geladen werden und im Textfeld angezeigt werden.

Das Layot mit allen Komponenten habe ich bereits:

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

// TextReader
public class TextReader {
	public static void main(String[] args) {
		new Panel();
	}
}

// Klasse Panel
class Panel extends JFrame {
	
	private JComboBox combo = new JComboBox();
	private JTextArea textarea = new JTextArea(15, 60);
	private JScrollPane sp = new JScrollPane(new JTextArea());

	// Konstruktor
	public Panel() 
	{
		// setzt Fenstertitel
		super("TextReader");
		// Groesse Panel
		setSize(new Dimension(500, 500));
		// Fenstergroesse nicht veraenderbar
		setResizable(false);
		// Reaktion auf Programm beenden
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		// Panel anlegen
		JPanel panel = new JPanel();
		// Layout
		setLayout(new BorderLayout());
		// Panel ins Zentrum setzen
		add(panel, BorderLayout.CENTER);
		// ComboBox hinzufuegen
		panel.add(combo, BorderLayout.WEST);
		// Textflaeche hinzufuegen
		panel.add(textarea, BorderLayout.CENTER);
		textarea.setText("Hallo");  //
		// ScrollBar hinzufuegen
		sp = new JScrollPane(panel);
		getContentPane().add(sp, BorderLayout.CENTER);
		// Größe an Inhalt anpassen
		pack();
		// den Frame anzeigen
		setVisible(true);
	}


}//Ende Klasse;
```

Würd mich freuen, wenn ihr mir helfen könnt


----------



## icarus2 (17. Jun 2009)

Um JComboBox-Events abzufangen musst du das Interface ItemListener implementieren und dort entsprechend die Methode public void itemStateChanged(ItemEvent e) überschreiben. Dann noch die JComboBox bei dem Listener adden.


----------



## madboy (17. Jun 2009)

So weit so gut. Wie war noch gleich die Frage? Geht's nicht, weißt du nicht, wie man Dateien liest, ...?


----------



## icarus2 (17. Jun 2009)

Nun ja, ich wollte nur sagen dass man einen ItemListener braucht, in dem das Laden der Daten gestartet wird ;-)

Wie man die Daten dann am besten lädt... da bin ich überfragt


----------



## madboy (17. Jun 2009)

Ich habe nicht dich gemeint, icarus2, sondern kenux


----------



## kenux (18. Jun 2009)

madboy hat gesagt.:


> So weit so gut. Wie war noch gleich die Frage? Geht's nicht, weißt du nicht, wie man Dateien liest, ...?



so liest man Dateien ein:


```
// oeffnet eine bestehende Datei
	  public void actionPerformed(ActionEvent ev) {
		  JFileChooser chooser = new JFileChooser();
		  if (chooser.showOpenDialog(TextReader.this) != JFileChooser.APPROVE_OPTION)
			return;
		  File file = chooser.getSelectedFile();
		  if (file == null)
			return;
		  FileReader reader = null;
		  try {
			  reader = new FileReader(file);
			  textarea.read(reader, null);
			  } catch (IOException ex) {
				  JOptionPane.showMessageDialog(TextReader.this,
				  "Datei nicht gefunden", "Fehler", JOptionPane.ERROR_MESSAGE);
		  } finally {
			  if (reader != null) {
				  try {
					  reader.close();
				  } catch (IOException x) { }
			  }
		  }
	  }
```

Weiß aber nicht wie ich die Dateinamen in die ComboBox reingekriegen soll

Hier ist der gesamte Code; hier habe ich das so gemacht, dass die Dateien per Menubar und Schaltfläche eingelesen werden.


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

// Klasse TextReader
public class TextReader extends JFrame {
	
	// Datei oeffnen
	private Action openAction = new Oeffnen();
	
	private JComboBox combo = new JComboBox();
	private JTextArea textarea = new JTextArea(15, 60);
	private JScrollPane sp = new JScrollPane(new JTextArea());
	
	// Konstruktor
	public TextReader() 
	{
		// setzt Fenstertitel
		super("TextReader");
		
		// Panel anlegen
		JPanel panel = new JPanel();
		// Layout
		setLayout(new BorderLayout());
		// Panel ins Zentrum setzen
		add(panel, BorderLayout.CENTER);
		// ComboBox hinzufuegen
		panel.add(combo, BorderLayout.WEST);
		// Textflaeche hinzufuegen
		panel.add(textarea, BorderLayout.CENTER);
		//textarea.setText("Hallo");
		// ScrollBar hinzufuegen
		sp = new JScrollPane(panel);
		getContentPane().add(sp, BorderLayout.CENTER);
		
		// Menu -> kommt weg
		setJMenuBar(createMenuBar());
	  }
	  
	  // Menu erstellen -> kommt weg
	  protected JMenuBar createMenuBar() {
		  JMenuBar menubar = new JMenuBar();
		  JMenu file = new JMenu("Datei");
		  menubar.add(file);
		  file.add(getOpenAction());
		  return menubar;
	  }
	  
	  // zum Datei oeffnen
	  protected Action getOpenAction() {
		  return openAction;
	  }
	  
	  // Klasse Oeffnen
	  class Oeffnen extends AbstractAction {
		  
		  // Konstruktor
		  public Oeffnen() 
		  {
			  super("Oeffnen");
		  }
		  
	  // oeffnet eine bestehende Datei
	  public void actionPerformed(ActionEvent ev) {
		  JFileChooser chooser = new JFileChooser();
		  if (chooser.showOpenDialog(TextReader.this) != JFileChooser.APPROVE_OPTION)
			return;
		  File file = chooser.getSelectedFile();
		  if (file == null)
			return;
		  FileReader reader = null;
		  try {
			  reader = new FileReader(file);
			  textarea.read(reader, null);
			  } catch (IOException ex) {
				  JOptionPane.showMessageDialog(TextReader.this,
				  "Datei nicht gefunden", "Fehler", JOptionPane.ERROR_MESSAGE);
		  } finally {
			  if (reader != null) {
				  try {
					  reader.close();
				  } catch (IOException x) { }
			  }
		  }
	  }
  }


public static void main(String[] args) {
	TextReader tr = new TextReader();
	tr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	tr.setSize(750, 350);
	tr.pack();
	tr.setVisible(true);
	}
}// Ende Klasse;
```


----------



## kenux (18. Jun 2009)

keiner ne Idee?? ist also doch etwas umfangreich anscheinend


----------



## Michael... (18. Jun 2009)

Im Prinzip ist es ganz einfach.
Die Inhalte einer ComboBox kann am entweder gleich beim Erstellen im Konstruktor mit geben, nachträglich über addItem() anfügen oder über das Model. Ist u.a. auch in der Doku beschrieben

Hier mal ein Bsp. mit einer ComboBox, die alle txt-Files des gewählten Ordners enthält.

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

import javax.swing.*;
import java.io.*;

public class ComboFileChooserDemo extends JFrame {
    
    private JButton button;
    private JFileChooser chooser;
    private JLabel label;
    private JComboBox combo;
    private DefaultComboBoxModel model;
    
    private CustomFileFilter fileFilter;
    
	public ComboFileChooserDemo() {
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setBounds(0, 0, 300, 150);
		this.setLocationRelativeTo(null);
		
    	button = new JButton("Ordner wechseln");
    	chooser = new JFileChooser();
    	chooser.setMultiSelectionEnabled(false);
    	chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
    	label = new JLabel("bitte zuerst einen Ordner auswählen");
    	
    	fileFilter = new CustomFileFilter();
    	model = new DefaultComboBoxModel();
    	
    	if (chooser.getCurrentDirectory()!=null) {
    		label.setText(chooser.getCurrentDirectory().toString());
    		this.setComboModel(chooser.getCurrentDirectory());
    	}
    	
    	combo = new JComboBox(model);
    	
    	getContentPane().add(button, BorderLayout.NORTH);
        getContentPane().add(label, BorderLayout.CENTER);
        getContentPane().add(combo, BorderLayout.SOUTH);
        
        button.addActionListener(new ActionListener(){
			public void actionPerformed(ActionEvent evt) {
				showFileChooser();
			}
        });
        
        combo.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent evt) {
				if (evt.getStateChange()==ItemEvent.SELECTED) {
					System.out.println("noch nix implementiert");
				}
			}
        });
	}
	
	public void showFileChooser() {
		if (chooser.showOpenDialog(this)==JFileChooser.APPROVE_OPTION) {
			label.setText(chooser.getSelectedFile().toString());
			this.setComboModel(chooser.getSelectedFile());
		}
	}
	
	public void setComboModel(File path) {
		File[] file = path.listFiles(fileFilter);
		model.removeAllElements();
		
		for (int i=0; i<file.length; i++) {
			model.addElement(file[i].getName());
		}
	}
 
	public static void main(String[] args) {
		new ComboFileChooserDemo().setVisible(true);
	}
}

class CustomFileFilter implements FileFilter {
	public boolean accept(File file) {
		if (file.getName().endsWith("txt"))
			return true;
		return false;
	}
}
```


----------



## icarus2 (18. Jun 2009)

madboy hat gesagt.:


> Ich habe nicht dich gemeint, icarus2, sondern kenux



Axooo, alles klar ^^


----------



## kenux (18. Jun 2009)

*@ Michael...*

Vielen Dank, das war genau das was ich brauchte


----------



## kenux (18. Jun 2009)

noch eine Frage:

wie kann ich denn das Verzeichnis per Konsole bestimmen, so dass im Combobox dann die jeweiligen Dateien angezeigt werden?


----------



## stefan. (19. Jun 2009)

DU meinst Parameter welche bei Programmstart übergeben werden ? Dazu musst du main(String[] args) - das String[] args abfragen, da stehen die drin


----------



## kenux (19. Jun 2009)

stefan. hat gesagt.:


> DU meinst Parameter welche bei Programmstart übergeben werden ? Dazu musst du main(String[] args) - das String[] args abfragen, da stehen die drin



ja das habe ich bereits getan, nur das Verzeichnis wird der Combobox irgendwie nicht übergeben, hat jemand ne idee wie ich das richtig machen kann?


----------



## Michael... (19. Jun 2009)

Na dann zeig doch mal Deinen Code - möglichst in als KSKB


----------



## kenux (19. Jun 2009)

Michael... hat gesagt.:


> Na dann zeig doch mal Deinen Code - möglichst in als KSKB



Hi Michael,

ich habe deinen vorgeschlagenen Code fast unverändert gelassen, damit sich keine Fehler einschleichen können.
So kommen wir jetzt zur Sache: Ich habe im Hauptprogramm die nötigen Sachen eingefügt, um von der Konsole den Pfad zu lesen. Das tut es eigentlich auch. Doch ich krieg die Verbindung zur Combobox irgendwie nicht hin, so dass die Dateien vom eingegebenen Pfad in der Combo gezeigt werden.
hier ist der gesamte Code:


```
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.Scanner; 
 
public class ComboFileChooserDemo extends JFrame {
    
    private JButton button;
    private JFileChooser chooser;
    private JLabel label;
    private JComboBox combo;
    private DefaultComboBoxModel model;
    
    private CustomFileFilter fileFilter;
    
    public ComboFileChooserDemo() {
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        this.setBounds(0, 0, 300, 150);
        this.setLocationRelativeTo(null);
        
        button = new JButton("Ordner wechseln");
        chooser = new JFileChooser();
        chooser.setMultiSelectionEnabled(false);
        chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
        label = new JLabel("bitte zuerst einen Ordner auswählen");
        
        fileFilter = new CustomFileFilter();
        model = new DefaultComboBoxModel();
        
        if (chooser.getCurrentDirectory()!=null) {
            label.setText(chooser.getCurrentDirectory().toString());
            this.setComboModel(chooser.getCurrentDirectory());
        }
        
        combo = new JComboBox(model);
        
        getContentPane().add(button, BorderLayout.NORTH);
        getContentPane().add(label, BorderLayout.CENTER);
        getContentPane().add(combo, BorderLayout.SOUTH);
        
        button.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent evt) {
                showFileChooser();
            }
        });
        
        combo.addItemListener(new ItemListener() {
            public void itemStateChanged(ItemEvent evt) {
                if (evt.getStateChange()==ItemEvent.SELECTED) {
                    System.out.println("noch nix implementiert");
                }
            }
        });
    }
    
    public void showFileChooser() {
        if (chooser.showOpenDialog(this)==JFileChooser.APPROVE_OPTION) {
            label.setText(chooser.getSelectedFile().toString());
            this.setComboModel(chooser.getSelectedFile());
        }
    }
    
    public void setComboModel(File path) {
        File[] file = path.listFiles(fileFilter);
        model.removeAllElements();
        
        for (int i=0; i<file.length; i++) {
            model.addElement(file[i].getName());
        }
    }
 
    public static void main(String[] args) {
	
		String nameOrdner;
		// z.B: Ordner 'C:\Programme' wählen (falls im Pfad leerzeichen
		// Klasse Scanner verwenden
		nameOrdner = args[0];
		
		File dir = new File(nameOrdner);
		// checken im welchem Verzeichnis
		System.out.println(dir.getPath());
		
		new ComboFileChooserDemo().setVisible(true);		
}
 
class CustomFileFilter implements FileFilter {
    public boolean accept(File file) {
        if (file.getName().endsWith(""))
            return true;
        return false;
    }
}
}
```


----------



## kenux (21. Jun 2009)

ist der Ansatz denn Ok, oder lieg ich total falsch?


----------



## Michael... (22. Jun 2009)

Soweit OK. Du musst halt Deinen eingelesenen Pfad der Klasse übergeben, z.B. im Konstruktor oder per setter-Methode

Ausserdem könntest Du noch überprüfen, ob beim Aufruf überhaupt ein Argument übergeben wurde, und ob es sich um einen gültigen Pfad handelt.


----------



## kenux (23. Jun 2009)

Soweit habe ich das jetzt alles gemacht.
Was mich stört ist allerdings, dass bei Dateiauswahl zuerst ein Fenster kommt wo man noch einmal eine Datei auswählen muss. Die Datei in der Combobox soll nach dem Klicken sofort geladen werden und im Texfeld angezeigt werden.
und außergewöhlich ist es auch, wenn man .java Datei öffnet verschwindet die ComboBox

Hier ist der gesamte Code:

```
/*
	kenux
*/

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

// Klasse TextReader
public class TextReader extends JFrame {
	
	private JTextArea textarea = new JTextArea(15, 60);
	private JScrollPane sp = new JScrollPane(new JTextArea());
	private JFileChooser chooser = new JFileChooser();;
    private JLabel label = new JLabel();;
    private JComboBox combo;
    private DefaultComboBoxModel model = new DefaultComboBoxModel();
	// Zum Oeffnen von betimmten Dateiendungen
	private DateiFilter fileFilter;
	// Zum Setzen vom Verzeichnis
	private static String F;
	private File f = new File(F);
	
	// Konstruktor
	public TextReader() 
	{
		// setzt Fenstertitel
		super("TextReader");
		// Panel anlegen
		JPanel panel = new JPanel();
		// Layout
		setLayout(new BorderLayout());
		// Panel ins Zentrum setzen
		getContentPane().add(panel, BorderLayout.CENTER);	
		// DateiFilter
        fileFilter = new DateiFilter();
		// ComboBox
        combo = new JComboBox(model);
		// Elemente platzieren
		panel.add(label, BorderLayout.WEST);
		panel.add(combo, BorderLayout.WEST);
		// Textflaeche hinzufuegen
		panel.add(textarea, BorderLayout.CENTER);
		// ScrollBar hinzufuegen
		sp = new JScrollPane(panel);
		getContentPane().add(sp, BorderLayout.CENTER);
		
		if (chooser.getCurrentDirectory()!= null) {
			// eingegebenes Verzeichnis setzen
			chooser.setCurrentDirectory(f);
			// Verzeichnis per Label anzeigen
			label.setText(chooser.getCurrentDirectory().toString());
			// Verzeichnis auswaehlen
            this.setComboModel(chooser.getCurrentDirectory());
        }
		
		
		combo.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent evt) {
                if (evt.getStateChange()==ItemEvent.SELECTED) {
					if (chooser.showOpenDialog(TextReader.this) != 
					JFileChooser.APPROVE_OPTION)
					return;
				File file = chooser.getSelectedFile();
				if (file == null)
					return;
				FileReader reader = null;
				try {
					reader = new FileReader(file);
					textarea.read(reader, null);
					} catch (IOException ex) {
						JOptionPane.showMessageDialog(TextReader.this,
						"Datei nicht gefunden", "Fehler", JOptionPane.ERROR_MESSAGE);
				  } finally {
					  if (reader != null) {
						  try {
							  reader.close();
						  } catch (IOException x) { }
					  }
				  }
				  	
                }
            }
        });
	}
	
		
	// Anzeigen der Elemente in der ComboBox
	public void setComboModel(File path) {
		File[] file = path.listFiles(fileFilter);
		model.removeAllElements();
		for (int i=0; i<file.length; i++) {
			model.addElement(file[i].getName());
		}
	}

	// Dateien filtern
	class DateiFilter implements FileFilter {
		public boolean accept(File file) {
			if (file.getName().endsWith("java") || 
			file.getName().endsWith("java~") ||
			file.getName().endsWith("class") ||
			file.getName().endsWith("txt"))
				return true;
			return false;
		}
	}


// main
public static void main(String[] args) {
	
	try {
		// Verzeichnis einlesen z.B 'C:\Programme'
		String nameOrdner;
		nameOrdner = args[0];
		// Verzeichnis setzen
		File dir = new File(nameOrdner);
		F = nameOrdner;

		TextReader tr = new TextReader();
		tr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		tr.setSize(700, 350);
		tr.pack();
		tr.setVisible(true);
		} 
	catch (Exception e) {
		System.out.println(
		"Zu wenig Parameter!");
		System.exit(0);
		}	
	}
}// Ende Klasse;
```


----------



## Michael... (24. Jun 2009)

kenux hat gesagt.:


> ```
> public class TextReader extends JFrame {
> ...
> getContentPane().add(panel, BorderLayout.CENTER);
> ...



Bau Dir das ganze doch mal Stück für Stück auf. In Deinem Code fügst Du mehrere Komponenten an der gleichen Stelle ein, das kann nicht gut gehen.


----------



## kenux (24. Jun 2009)

danke für den Hinweis.

hast du auch ne Idee wie ich es mit dem Laden von Dateien besser machen kann?


----------



## Michael... (24. Jun 2009)

Naja, dass sich nach der Selektion in der ComboBox der Dialog öffnet liegt daran, dass Du da noch meinen FileChooser im Listener dirn hast der eigentlich zur Befüllung der ComboBox dient.


----------



## kenux (24. Jun 2009)

aber wenn ich den FileChooser im Listener wegmache, dann wird nichts mehr im Textfeld geladen


----------



## Michael... (25. Jun 2009)

Ich dachte Du willst anhand der Selektion in der ComboBox eine Datei laden. Daher musst Du Dir die Information aus dieser auch holen.


----------



## kenux (26. Jun 2009)

OK habs gefunden.
hier ist die Lösung für andere:

```
// ItemListener
		combo.addItemListener(new ItemListener() {
			public void itemStateChanged(ItemEvent evt) {
				if (evt.getStateChange()==ItemEvent.SELECTED) {
					String datName = (String)combo.getSelectedItem();					
					FileReader reader = null;
					try {
						reader = new FileReader(F + "\\\\" + datName);
						textarea.read(reader, null);
						} catch (IOException ex) {
							JOptionPane.showMessageDialog(TextReader.this,
							"Datei nicht gefunden oder kann nicht gelesen werden", 
							"Fehler", JOptionPane.ERROR_MESSAGE);
					} finally {
						if (reader != null) {
							try {
								reader.close();
							} catch (IOException x) { }
						  }
					  }
				}
			}
		});
```


----------

