import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
/**
* Klasse JFileChooserTest
*
* @author GUI-Programmer
* @version 28.09.2011
*/
public class JFileChooserTest extends JPanel {
// Attribute
protected JFileChooser filechooser;
protected JList listFiles;
protected JButton btnHinzufuegen, btnFertigstellen;
private int valueChanged, index;
private ArrayList<File> fileList, completeFileList;
// Konstruktor
public JFileChooserTest() {
setPreferredSize(new Dimension(800, 450));
setLayout(null);
filechooser = new JFileChooser();
filechooser.setApproveButtonText("Hinzufügen");
filechooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
filechooser.setMultiSelectionEnabled(true);
filechooser.setBounds(10, 10, 778, 422);
add(filechooser);
MyListener mylistener = new MyListener();
initializeButtons(filechooser);
btnHinzufuegen.removeActionListener(btnHinzufuegen.getActionListeners()[0]);
btnHinzufuegen.addActionListener(mylistener);
btnFertigstellen.setText("Erstellen");
btnFertigstellen.removeActionListener(btnFertigstellen.getActionListeners()[0]);
btnFertigstellen.addActionListener(mylistener);
initializeList(filechooser);
listFiles.addListSelectionListener(mylistener);
valueChanged = 0;
index = -1;
fileList = new ArrayList<File>();
completeFileList = new ArrayList<File>();
}
// Methoden
/**
* Sucht die beiden JButtons aus dem JFileChooser. Wenn sie gefunden
* wurden, werden die beiden JButtons btnHinzufuegen und btnFertigstellen
* mit ihnen initialisiert.
*/
private void initializeButtons(Component component) {
if (component instanceof JButton) {
JButton button = (JButton)component;
String text = button.getText();
if (text != null) {
if(text.equals("Hinzufügen")) btnHinzufuegen = button;
if(text.equals("Abbrechen")) btnFertigstellen = button;
}
}
else if (component instanceof Container) {
Container container = (Container)component;
for (int i = 0; i < container.getComponentCount(); i++) {
Component child = container.getComponent(i);
initializeButtons(child);
}
}
}
/**
* Sucht die JList aus dem JFileChooser. Wenn sie gefunden wurde, wird
* die JList listFiles mit ihr initialisiert.
*/
private void initializeList(Component component) {
if (component instanceof JList) {
JList list = (JList)component;
listFiles = list;
}
else if (component instanceof Container) {
Container container = (Container)component;
for (int i = 0; i < container.getComponentCount(); i++) {
Component child = container.getComponent(i);
initializeList(child);
}
}
}
private class MyListener implements ActionListener, ListSelectionListener {
@Override
public void actionPerformed(ActionEvent evt) {
Object src = evt.getSource();
if(src.equals(btnHinzufuegen)) {
List selectedValues = listFiles.getSelectedValuesList();
// Wenn Strg + A gedrückt wurde, und somit alle ausgewählt wurden
if(selectedValues.size()>fileList.size()) {
for(int i=0; i<selectedValues.size(); i++) {
// evtl. noch: die Directorys auslassen --> if file.isDirectory()
completeFileList.add(new File(selectedValues.get(i).toString()));
}
/*
* Andernfalls wird eine neue Liste erstellt, bei der dann die doppelt
* -vorkommenden Files und die die wieder abgewählt wurden entfernt werden
* (per retainAll(...).
* Als letztes wird noch die Liste, welche alle Files beinhaltet mit den
* den Files der erstellten Liste weiter aufgefüllt
*/
} else {
ArrayList<File> fileListSorted = new ArrayList<File>(fileList);
fileListSorted.retainAll(selectedValues);
fileList = new ArrayList<File>();
for(int i=0; i<fileListSorted.size(); i++) {
completeFileList.add(fileListSorted.get(i));
}
}
}
if(src.equals(btnFertigstellen)) {
for(int i=0; i<completeFileList.size(); i++) {
System.out.println(completeFileList.get(i));
}
}
}
@Override
public void valueChanged(ListSelectionEvent evt) {
Object src = evt.getSource();
if(src.equals(listFiles)) {
// Durch das Benutzen der Variable valueChanged wird verhindert,
// das der darauffolgende Code doppelt aufgerufen wird.
valueChanged++;
if(valueChanged == 1) {
// Der Index des ausgewählten Files (also der das Event "wirft")
// wird ermittelt
if(evt.getFirstIndex() == index) {
index = evt.getLastIndex();
} else if(evt.getLastIndex() == index) {
index = evt.getFirstIndex();
} else index = evt.getLastIndex();
int position = getPosition();
// Es wird ausgeschlossen, dass lediglich ein Verzeichnis geöffnet,
// anstatt ausgewählt wurde
if(position != -1) {
List selectedValues = listFiles.getSelectedValuesList();
File file = new File(selectedValues.get(position).toString());
if(!file.isDirectory()) {
fileList.add(file);
}
}
} else valueChanged = 0;
}
}
/**
* Die Position des ausgewählten Files in der Liste der ausgewählten Files wird
* ermittelt und zurückgegeben.
*/
private int getPosition() {
int position = -1;
int[] selectedIndices = listFiles.getSelectedIndices();
for(int i=0; i<selectedIndices.length; i++) {
if(index == selectedIndices[i]) {
position = i;
break;
}
}
return position;
}
}
/**
* Es wird ein JFrame erstellt der die GUI präsntiert, somit das
* Programm startet
*/
public static void createFrame() {
JFrame f = new JFrame("JFileChooserTest");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setResizable(false);
f.setContentPane(new JFileChooserTest());
f.pack();
f.setVisible(true);
f.setLocationRelativeTo(null);
}
//Main-Methode
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
createFrame();
}
});
}
}