Wie binde ich eine JavaFX ProgressBar an eine Datei Übertragung?


#1
Hallo,
Ich habe einen FileClient und einen FileServer gemacht, weiß aber nicht, wie ich den Fortschritt der Datei Übertragung an die ProgressBar binden kann.
FileClient:
Java:
public class FileClient extends Application implements FileTransfer {
    public static final int PORT = 7070;
    public static final String ADDRESS = "michadaniel4.ddns.net";

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        VBox root = new VBox();
        Button button = new Button("Choose your File...");
        button.setPrefWidth(400);
        button.setPrefHeight(50);
        ProgressBar progressBar = new ProgressBar();
        progressBar.setPrefWidth(400);
        progressBar.setPrefHeight(50);
        root.getChildren().addAll(button, progressBar);
        Scene scene = new Scene(root, 400, 100);
        primaryStage.setScene(scene);
        primaryStage.setResizable(false);
        primaryStage.sizeToScene();
        primaryStage.setTitle("File Client");
        primaryStage.show();

        button.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                File file = new FileChooser().showOpenDialog(null).getAbsoluteFile();
                Task task = new Task() {
                    @Override
                    protected Object call() throws Exception {
                        try {
                            Socket socket = new Socket(ADDRESS, PORT);
                            DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream());
                            byte[] bytes = readData(file.getAbsolutePath());
                            dataOutputStream.writeInt(bytes.length);
                            dataOutputStream.write(bytes);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                        return null;
                    }
                };
                new Thread(task).start();
            }
        });
    }

    @Override
    public boolean writeData(byte[] data, String fileName) {
        File file = new File(fileName);
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(file);
            fileOutputStream.write(data);
            fileOutputStream.flush();
            return true;
        } catch (FileNotFoundException e) {
            System.err.println(file + " doesn't exist!");
        } catch (IOException e) {
            System.err.println("Problems writing data to " + file);
        } finally {
            try {
                if (fileOutputStream != null) fileOutputStream.close();
            } catch (IOException e) {
                System.err.println("FileOutputStream cannot be closed");
            }
        }
        return false;
    }

    @Override
    public byte[] readData(String fileName) {
        File file = new File(fileName);
        FileInputStream fileInputStream = null;
        byte[] data = null;
        try {
            fileInputStream = new FileInputStream(file);
            data = new byte[(int) file.length()];
            fileInputStream.read(data);
        } catch (FileNotFoundException e) {
            System.err.println(file + " doesn't exist!");
        } catch (IOException e) {
            System.err.println("Problems reading data from " + file);
        } finally {
            try {
                if (fileInputStream != null) fileInputStream.close();
            } catch (IOException e) {
                System.err.println("FileInputStream cannot be closed");
            }
        }
        return data;
    }
}
FileServer:
Java:
public class FileServer implements FileTransfer {
    public static final int PORT = 7070;

    public static void main(String[] args) {
        try {
            ServerSocket serverSocket = new ServerSocket(PORT);
            while (true) {
                Socket socket = serverSocket.accept();
                DataInputStream dataInputStream = new DataInputStream(socket.getInputStream());
                long start = System.currentTimeMillis();
                int length = dataInputStream.readInt();
                if (length > 0) {
                    byte[] bytes = new byte[length];
                    dataInputStream.readFully(bytes);
                    new FileServer().writeData(bytes, "C:\\Users\\Michadaniel\\IdeaProjects\\FileTransfer\\in\\test.jar");
                }
                long stop = System.currentTimeMillis();
                double time = (stop - start) / 1000;
                System.out.println("Time: " + time + "s");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Override
    public boolean writeData(byte[] data, String fileName) {
        File file = new File(fileName);
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(file);
            fileOutputStream.write(data);
            fileOutputStream.flush();
            return true;
        } catch (FileNotFoundException e) {
            System.err.println(file + " doesn't exist!");
        } catch (IOException e) {
            System.err.println("Problems writing data to " + file);
        } finally {
            try {
                if (fileOutputStream != null) fileOutputStream.close();
            } catch (IOException e) {
                System.err.println("FileOutputStream cannot be closed");
            }
        }
        return false;
    }

    @Override
    public byte[] readData(String fileName) {
        File file = new File(fileName);
        FileInputStream fileInputStream = null;
        byte[] data = null;
        try {
            fileInputStream = new FileInputStream(file);
            data = new byte[(int) file.length()];
            fileInputStream.read(data);
        } catch (FileNotFoundException e) {
            System.err.println(file + " doesn't exist!");
        } catch (IOException e) {
            System.err.println("Problems reading data from " + file);
        } finally {
            try {
                if (fileInputStream != null) fileInputStream.close();
            } catch (IOException e) {
                System.err.println("FileInputStream cannot be closed");
            }
        }
        return data;
    }
}
 
#2
Ok, es kam zwar keine Antwort, aber ich habe es inzwischen zu einer selbstständigen Lösung gebracht:D.
Also ist das Thema erledigt.

FileClient:
Java:
package net.ddns.michadaniel4.filetransfer;

import javafx.application.Application;
import javafx.application.Platform;
import javafx.concurrent.Task;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.VBox;
import javafx.stage.FileChooser;
import javafx.stage.Stage;

import java.io.*;
import java.net.Socket;

/**
* Created by Michadaniel on 14.03.2016.
*/
public class FileClient extends Application implements FileTransfer {
    public static final int PORT = 7070;
    public static final String ADDRESS = "michadaniel4.ddns.net";

    public ProgressBar progressBar = new ProgressBar();

    public Task task = null;

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {
        VBox root = new VBox();
        Button button = new Button("Choose your File...");
        button.setPrefWidth(400);
        button.setPrefHeight(50);
        progressBar.setPrefWidth(400);
        progressBar.setPrefHeight(50);
        root.getChildren().addAll(button, progressBar);
        Scene scene = new Scene(root, 400, 100);
        primaryStage.setScene(scene);
        primaryStage.setResizable(false);
        primaryStage.sizeToScene();
        primaryStage.setTitle("File Client");
        primaryStage.show();

        button.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                File file = new FileChooser().showOpenDialog(null).getAbsoluteFile();
                new Thread(new Runnable() {
                    @Override
                    public void run() {
                        try {
                            Socket socket = new Socket(ADDRESS, PORT);
                            DataOutputStream dataOutputStream = new DataOutputStream(socket.getOutputStream()) {
                                @Override
                                public void write(byte b[], int off, int len) throws IOException {
                                    if ((off | len | (b.length - (len + off)) | (off + len)) < 0)
                                        throw new IndexOutOfBoundsException();

                                    task = new Task() {
                                        @Override
                                        protected Object call() throws Exception {
                                            for (int i = 0; i < len; i++) {
                                                write(b[off + i]);
                                                updateProgress(i, len);
                                            }
                                            return null;
                                        }
                                    };
                                    Platform.runLater(new Runnable() {
                                        @Override
                                        public void run() {
                                            progressBar.progressProperty().bind(task.progressProperty());
                                        }
                                    });
                                    task.run();
                                }
                            };
                            byte[] bytes = readData(file.getAbsolutePath());
                            dataOutputStream.writeUTF(file.getName());
                            dataOutputStream.writeInt(bytes.length);
                            dataOutputStream.write(bytes);
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }).start();
            }
        });
    }

    @Override
    public boolean writeData(byte[] data, String fileName) {
        File file = new File(fileName);
        FileOutputStream fileOutputStream = null;
        try {
            fileOutputStream = new FileOutputStream(file);
            fileOutputStream.write(data);
            fileOutputStream.flush();
            return true;
        } catch (FileNotFoundException e) {
            System.err.println(file + " doesn't exist!");
        } catch (IOException e) {
            System.err.println("Problems writing data to " + file);
        } finally {
            try {
                if (fileOutputStream != null) fileOutputStream.close();
            } catch (IOException e) {
                System.err.println("FileOutputStream cannot be closed");
            }
        }
        return false;
    }

    @Override
    public byte[] readData(String fileName) {
        File file = new File(fileName);
        FileInputStream fileInputStream = null;
        byte[] data = null;
        try {
            fileInputStream = new FileInputStream(file);
            data = new byte[(int) file.length()];
            fileInputStream.read(data);
        } catch (FileNotFoundException e) {
            System.err.println(file + " doesn't exist!");
        } catch (IOException e) {
            System.err.println("Problems reading data from " + file);
        } finally {
            try {
                if (fileInputStream != null) fileInputStream.close();
            } catch (IOException e) {
                System.err.println("FileInputStream cannot be closed");
            }
        }
        return data;
    }
}
 

Neue Beiträge