informatiker85
Grünschnabel
Hallo,
ich habe eine kleines Programm geschrieben, das eine Winamp-Playlist nimmt und alle Dateien in einen Ordner kopiert. So weit, so gut, der Kern des Programms läuft auch wunderbar. Mein Problem ist, dass im SwingGUI eine TextArea als Logging benutzt wird, damit man sieht, wo es Probleme mit dem Kopieren gab und wo da Programm gerade ist.
Das Logging klappt eigentlich auch, nur liefert es den kompletten Text erst ans GUI wenn das Kopieren komplett fertig ist. Das ist natürlich nicht Sinn der Sache bei einem Logging.
Nach einigem Lesen im Forum habe ich verschiedene Varianten mit invokeLater() und invokeAndWait() versucht, die das Problem aber nicht lösten.
Hat einer eine Idee, wie ich das GUI nach jeder Datei aktualisieren kann?
Danke.
ich habe eine kleines Programm geschrieben, das eine Winamp-Playlist nimmt und alle Dateien in einen Ordner kopiert. So weit, so gut, der Kern des Programms läuft auch wunderbar. Mein Problem ist, dass im SwingGUI eine TextArea als Logging benutzt wird, damit man sieht, wo es Probleme mit dem Kopieren gab und wo da Programm gerade ist.
Das Logging klappt eigentlich auch, nur liefert es den kompletten Text erst ans GUI wenn das Kopieren komplett fertig ist. Das ist natürlich nicht Sinn der Sache bei einem Logging.
Nach einigem Lesen im Forum habe ich verschiedene Varianten mit invokeLater() und invokeAndWait() versucht, die das Problem aber nicht lösten.
Hat einer eine Idee, wie ich das GUI nach jeder Datei aktualisieren kann?
Danke.
Code:
import java.awt.Component;
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.nio.channels.FileChannel;
public class PlaylistToFolder extends JFrame
{
JTextField playListField, folderField;;
JLabel playListLabel, folderLabel, progressLabel;
JProgressBar progressBar;
JButton playlistButton, folderButton, startButton;
JTextArea logging;
private String copyFile(String src, String dest)
{
File fromFile = new File(src);
File toFile = new File(dest + "\\"
+ src.substring(src.lastIndexOf("\\"), src.length()));
try
{
FileChannel inputchannel = new FileInputStream(fromFile)
.getChannel();
FileChannel outputchannel = new FileOutputStream(toFile)
.getChannel();
inputchannel.transferTo(0, inputchannel.size(), outputchannel);
inputchannel.close();
outputchannel.close();
} catch (FileNotFoundException e)
{
return ("Fehler! Datei existiert nicht: " + src);
} catch (IOException e)
{
return ("Fehler beim Lesen oder Schreiben der Datei: " + src);
}
return ("Datei erfolgreich kopiert: " + toFile);
}
private void parsePlaylist()
{
int lineNumber = 0;
try
{
BufferedReader input = new BufferedReader(new FileReader(
playListField.getText()));
try
{
while (input.ready())
{
String tmp = input.readLine();
lineNumber++;
if (lineNumber % 2 == 1 && lineNumber != 1)
{
if (lineNumber == 3)
{
logging
.setText(copyFile(tmp, folderField
.getText()));
} else
{
logging.setText(logging.getText() + "\n"
+ copyFile(tmp, folderField.getText()));
}
}
}
logging.setText(logging.getText()
+ "\n\n Alle Aufgaben abgeschlossen.");
return;
} catch (IOException e)
{
logging.setText(logging.getText()
+ "Fehler beim Lesen oder Schreiben der Datei: "
+ playListField.getText());
return;
}
} catch (FileNotFoundException e)
{
logging.setText(logging.getText()
+ "Fehler! Datei existiert nicht: "
+ playListField.getText());
return;
}
}
private void addComponent(Container cont, GridBagLayout gbl, Component c,
int x, int y, int width, int height, double weightx, double weighty)
{
GridBagConstraints gbc = new GridBagConstraints();
gbc.fill = GridBagConstraints.BOTH;
gbc.gridx = x;
gbc.gridy = y;
gbc.gridwidth = width;
gbc.gridheight = height;
gbc.weightx = weightx;
gbc.weighty = weighty;
gbl.setConstraints(c, gbc);
cont.add(c);
}
public PlaylistToFolder(int screenWidth, int screenHeight)
{
this.setSize(700, 500);
this.setLocation((screenWidth - this.getWidth()) / 2,
(screenHeight - this.getHeight()) / 2);
this.setTitle("Playlist-to-Folder");
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
Container cont = this.getContentPane();
GridBagLayout gbl = new GridBagLayout();
this.setLayout(gbl);
playListLabel = new JLabel("Playlist: ");
folderLabel = new JLabel("Ordner: ");
progressLabel = new JLabel("Fortschritt: ");
playListField = new JTextField(
"C:\\Users\\USER 1\\Desktop\\testlist.m3u");
folderField = new JTextField("C:\\Users\\USER 1\\Desktop\\test");
progressBar = new JProgressBar();
logging = new JTextArea();
logging.setText("");
playlistButton = new JButton("Durchsuchen...");
folderButton = new JButton("Durchsuchen...");
startButton = new JButton("Start");
ActionListener playlistListen = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e)
{
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
chooser.setMultiSelectionEnabled(false);
javax.swing.filechooser.FileFilter filter = new javax.swing.filechooser.FileFilter() {
public boolean accept(File file)
{
if (file.isDirectory())
return true;
if (file.getName().endsWith(".m3u"))
return true;
else
return false;
}
public String getDescription()
{
return "Playlists (*.m3u)";
}
};
chooser.setFileFilter(filter);
int option = chooser.showOpenDialog(PlaylistToFolder.this);
if (option == JFileChooser.APPROVE_OPTION)
{
File file = chooser.getSelectedFile();
PlaylistToFolder.this.playListField.setText(file
.getAbsolutePath());
} else
{
// statusbar.setText("Sie haben " + filelist + " gewählt.");
// statusbar.setText("Sie haben abgebrochen.");
System.out.println("Abbruch");
}
}
};
ActionListener folderListen = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e)
{
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.setMultiSelectionEnabled(false);
int option = chooser.showOpenDialog(PlaylistToFolder.this);
if (option == JFileChooser.APPROVE_OPTION)
{
File file = chooser.getSelectedFile();
PlaylistToFolder.this.folderField.setText(file
.getAbsolutePath());
} else
{
// statusbar.setText("Sie haben " + filelist + " gewählt.");
// statusbar.setText("Sie haben abgebrochen.");
System.out.println("Abbruch");
}
}
};
ActionListener startListen = new ActionListener() {
@Override
public void actionPerformed(ActionEvent e)
{
new Thread()
{
public void run()
{
try
{
// SwingUtilities.invokeLater(new Runnable() {
SwingUtilities.invokeAndWait(new Runnable()
{
public void run()
{
PlaylistToFolder.this.parsePlaylist();
}
});
}
catch (InterruptedException e)
{
e.printStackTrace();
}
catch (InvocationTargetException e)
{
e.printStackTrace();
}
}
}.start();
}
};
playlistButton.addActionListener(playlistListen);
folderButton.addActionListener(folderListen);
startButton.addActionListener(startListen);
this.addComponent(cont, gbl, playListLabel, 0, 0, 1, 1, 0, 0);
this.addComponent(cont, gbl, folderLabel, 0, 1, 1, 1, 0, 0);
this.addComponent(cont, gbl, playListField, 1, 0, 3, 1, 1, 0);
this.addComponent(cont, gbl, folderField, 1, 1, 3, 1, 1, 0);
this.addComponent(cont, gbl, playlistButton, 4, 0, 1, 1, 0, 0);
this.addComponent(cont, gbl, progressLabel, 0, 3, 1, 1, 0, 0);
this.addComponent(cont, gbl, progressBar, 1, 3, 5, 1, 1, 0);
this.addComponent(cont, gbl, folderButton, 4, 1, 1, 1, 0, 0);
this.addComponent(cont, gbl, startButton, 4, 2, 1, 1, 0, 0);
this.addComponent(cont, gbl, new JScrollPane(logging), 0, 4, 5, 1,1, 1);
this.setVisible(true);
}
public static void main(String[] args)
{
Toolkit toolkit = Toolkit.getDefaultToolkit();
new PlaylistToFolder(toolkit.getScreenSize().width, toolkit
.getScreenSize().height);
}
}