Я должен сделать программу ftps для учебы.Я использую библиотеку ftp4j, потому что у меня не было достаточно времени, чтобы закончить свою программу вовремя.
Мой «ElementsTab» состоит из «Process», к которому я добавляю слушателей для получения статуса загруженного файла
Я создал код для добавления статуса в мою Jtable, но он не записывает новое значение ('En cours', 'Transféré' ...).Справедливо написать «En внимательный».
класс процесса
public class Process implements ftp4j.FTPDataTransferListener {
private List<PropertyChangeListener> liste = new ArrayList<PropertyChangeListener>();
File file;
public Process(File file) {
this.file = file;
}
Process(int rowIndex, Object aValue) {
this.file = (File) aValue;
}
public File getFile() {
return file;
}
public String getFileName() {
return file.getName();
}
public long getSize() {
return file.length();
}
public String getStatut(){
if(status != null || !"En attente".equals(status)){
return status;
}else{
return "En attente";
}
}
//création de l'évènement
public void setStatus(String pNewStatus){
//appel à la méthode qui averti les différents listeners du changement de la variable.
firePropertyChange(new PropertyChangeEvent(this, "status", status, pNewStatus));
status = pNewStatus;
}
public String getSize(long bytes) {
if (bytes > 1048576) {
double div = bytes / 1048576;
return div + " MB";
} else if (bytes > 1024) {
double div = bytes / 1024;
return div + " KB";
} else {
return bytes + " bits";
}
}
private String status = "En attente";
@Override
public void started() {
this.setStatus("En cours");
System.out.println("parti!");
}
@Override
public void transferred(int length) {
}
@Override
public void completed() {
this.setStatus("Transféré");
System.out.println("fini!");
}
@Override
public void aborted() {
this.setStatus("Annulé");
}
@Override
public void failed() {
this.setStatus("Echoué");
}
public void addPropertyChangeListener(PropertyChangeListener listener){
liste.add(listener);
}
public void removePropertyChangeListener(PropertyChangeListener listener){
liste.remove(listener);
}
//envoie l'évènement aux listeners
private void firePropertyChange(PropertyChangeEvent propertyChangeEvent) {
for ( PropertyChangeListener listener : liste){
listener.propertyChange(propertyChangeEvent);
}
}
}
класс ElementsTab
public class ElementsTab extends AbstractTableModel implements PropertyChangeListener{
private static final ArrayList<Process> processList = new ArrayList<Process>();
private String[] columnNames;
public ElementsTab() {
columnNames = new String[] {"Fichier", "Taille", "Progression","Status"};
}
public void addLigne(Process p){
p.addPropertyChangeListener(this);
processList.add(p);
//Fire table row insertion notification to table.
fireTableRowsInserted(getRowCount()-1,getRowCount()-1);
}
@Override
public int getColumnCount() {
return columnNames.length;
}
@Override
public int getRowCount() {
return processList.size();
}
@Override
public String getColumnName(int col) {
return columnNames[col];
}
public Process getElement(String e){
if(processList.contains(e)){
return processList.get(processList.indexOf(e));
}else{
return null;
}
}
public void removed(int entier){
processList.remove(entier).addPropertyChangeListener(this);
fireTableDataChanged();
}
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
try {
Process p = processList.get(rowIndex);
switch(columnIndex){
case 0: //Filename
return p.getFileName();
case 1: //Size
return p.getSize(p.getSize());
case 2: //barre progression
return "0";//new Integer(p.getBitsTranmis());
case 3: //statut
return p.getStatut();//"En attente";//p.getStatut(rowIndex);
case 4:
return p.getFile();
}
} catch(Exception e) {
///Exception occurs when user removes some rows and progress bar requesting old index.. Must catch this otherwise runtime error
System.out.println(e);
}
return "";
}
@Override
public void propertyChange(PropertyChangeEvent evt) {
fireTableDataChanged();
System.out.println("PropertyChangeEvent");
}
}
button action
public static File[] files;
public ElementsTab e = new ElementsTab();
public Component frame = null;
private void jButtonPActionPerformed(java.awt.event.ActionEvent evt) {
JFileChooser chooser = new JFileChooser();
// Enable multiple selections
chooser.setMultiSelectionEnabled(true);
chooser.setFileFilter(new ParcourirFiltre());
chooser.setAcceptAllFileFilterUsed(false);
chooser.setDialogTitle("Selection d'images");
// Show the dialog; wait until dialog is closed
chooser.showOpenDialog(this);
// Retrieve the selected files. This method returns empty
// if multiple-selection mode is not enabled.
files = chooser.getSelectedFiles();
//ProgressRenderer pr = new ProgressRenderer();
for( int z = 0; z<files.length; ++z){
if (!(files[z].length() > 5242880)){
if(verif(files[z].getName())==true){
e.addLigne(new Process(files[z]));
}
}else{
JOptionPane.showMessageDialog(frame, "Taille du fichier '" + files[z].getName() + "' supérieure à 5MB","Erreur fichier",JOptionPane.WARNING_MESSAGE);
}
}
jTable1.setModel(e);
jTable1.getColumnModel().getColumn(2).setCellRenderer(new ProgressRenderer());
}
Публичное свойство void propertyChange (PropertyChangeEvent evt) моего ElementsTab никогда не вызывалось.Извините, если мой английский плохой.
Вопрос прост: я бы хотел, чтобы он добавил другой статус загружаемого файла