From 959e4385998f8f5695fc63f7fdc33808a5c2608e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jan=20Ko=C5=BEusznik?= <jan@kozusznik.cz> Date: Sun, 28 Mar 2021 22:43:00 +0200 Subject: [PATCH] RemoteLoader --- .gitignore | 4 +- src/main/java/koz01/java2/lab08/App.java | 31 -------- .../java/koz01/java2/lab08/IndexReader.java | 61 ++++++++++++++++ .../java/koz01/java2/lab08/LocalLoader.java | 32 ++++++++ .../java2/lab08/LocalLoaderControler.java | 19 +++++ .../java/koz01/java2/lab08/RemoteLoader.java | 33 +++++++++ .../java2/lab08/RemoteLoaderControler.java | 73 +++++++++++++++++++ .../koz01/java2/lab08/LocalLoader.fxml | 16 ++++ .../koz01/java2/lab08/RemoteLoader.fxml | 21 ++++++ 9 files changed, 258 insertions(+), 32 deletions(-) delete mode 100644 src/main/java/koz01/java2/lab08/App.java create mode 100644 src/main/java/koz01/java2/lab08/IndexReader.java create mode 100644 src/main/java/koz01/java2/lab08/LocalLoader.java create mode 100644 src/main/java/koz01/java2/lab08/LocalLoaderControler.java create mode 100644 src/main/java/koz01/java2/lab08/RemoteLoader.java create mode 100644 src/main/java/koz01/java2/lab08/RemoteLoaderControler.java create mode 100644 src/main/resources/koz01/java2/lab08/LocalLoader.fxml create mode 100644 src/main/resources/koz01/java2/lab08/RemoteLoader.fxml diff --git a/.gitignore b/.gitignore index 3771e04..4cd19ae 100644 --- a/.gitignore +++ b/.gitignore @@ -11,4 +11,6 @@ *.ear *.iml -*.idea \ No newline at end of file +*.idea + +lab08.imgs diff --git a/src/main/java/koz01/java2/lab08/App.java b/src/main/java/koz01/java2/lab08/App.java deleted file mode 100644 index 237f340..0000000 --- a/src/main/java/koz01/java2/lab08/App.java +++ /dev/null @@ -1,31 +0,0 @@ -package koz01.java2.lab08; - -import javafx.application.Application; -import javafx.scene.Scene; -import javafx.scene.layout.BorderPane; -import javafx.stage.Stage; - - -/** - * JavaFX App - */ -public class App extends Application { - - @Override - public void start(Stage primaryStage) { - try { - BorderPane root = new BorderPane(); - Scene scene = new Scene(root,400,400); - scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm()); - primaryStage.setScene(scene); - primaryStage.show(); - } catch(Exception e) { - e.printStackTrace(); - } - } - - public static void main(String[] args) { - launch(); - } - -} \ No newline at end of file diff --git a/src/main/java/koz01/java2/lab08/IndexReader.java b/src/main/java/koz01/java2/lab08/IndexReader.java new file mode 100644 index 0000000..8ae3d52 --- /dev/null +++ b/src/main/java/koz01/java2/lab08/IndexReader.java @@ -0,0 +1,61 @@ + +package koz01.java2.lab08; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.net.URL; +import java.nio.ByteBuffer; +import java.nio.channels.Channels; +import java.nio.channels.FileChannel; +import java.nio.channels.ReadableByteChannel; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.StandardOpenOption; + +import javafx.scene.image.Image; +import lombok.extern.log4j.Log4j2; + +@Log4j2 +public class IndexReader { + + private static final String URL = "http://kozusznik.cz/resources/java2/"; + private static final String IMAGE_NAME = "lab08.imgs"; + + public Image readImage(int index) { + + try (FileChannel fc = FileChannel.open(getFile())) + { + byte[] data = getData(fc, index); + return new Image(new ByteArrayInputStream(data)); + } + catch (IOException exc) { + log.error("read", exc); + return null; + } + + } + + private Path getFile() throws IOException { + Path LocalFile = Files.createTempFile(null, null).getParent().resolve( + IMAGE_NAME); + if (!Files.exists(LocalFile)) { + try (ReadableByteChannel in = Channels.newChannel(new URL( + URL + IMAGE_NAME).openStream()); + FileChannel out = FileChannel.open(LocalFile, + StandardOpenOption.CREATE_NEW, StandardOpenOption.WRITE)) + { + ByteBuffer bb = ByteBuffer.allocate(1024 * 1024); + while (0 <= in.read(bb)) { + bb.flip(); + out.write(bb); + bb.clear(); + } + } + } + return LocalFile; + } + + private byte[] getData(FileChannel fc, int index) throws IOException { + return new byte[0]; + } +} diff --git a/src/main/java/koz01/java2/lab08/LocalLoader.java b/src/main/java/koz01/java2/lab08/LocalLoader.java new file mode 100644 index 0000000..2e68465 --- /dev/null +++ b/src/main/java/koz01/java2/lab08/LocalLoader.java @@ -0,0 +1,32 @@ + +package koz01.java2.lab08; + +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.stage.Stage; + +/** + * JavaFX App + */ +public class LocalLoader extends Application { + + @Override + public void start(Stage primaryStage) { + try { + Parent root = FXMLLoader.load(getClass().getResource("LocalLoader.fxml")); + Scene scene = new Scene(root); + primaryStage.setScene(scene); + primaryStage.show(); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + launch(); + } + +} diff --git a/src/main/java/koz01/java2/lab08/LocalLoaderControler.java b/src/main/java/koz01/java2/lab08/LocalLoaderControler.java new file mode 100644 index 0000000..bba0791 --- /dev/null +++ b/src/main/java/koz01/java2/lab08/LocalLoaderControler.java @@ -0,0 +1,19 @@ +package koz01.java2.lab08; + +import javafx.fxml.FXML; +import javafx.scene.control.TextField; +import javafx.scene.image.ImageView; + +public class LocalLoaderControler { + + @FXML + private ImageView imageView; + + @FXML + private TextField indexTextField; + + public void readButton() { + imageView.setImage(new IndexReader().readImage(Integer.parseInt( + indexTextField.getText()))); + } +} diff --git a/src/main/java/koz01/java2/lab08/RemoteLoader.java b/src/main/java/koz01/java2/lab08/RemoteLoader.java new file mode 100644 index 0000000..ef69d84 --- /dev/null +++ b/src/main/java/koz01/java2/lab08/RemoteLoader.java @@ -0,0 +1,33 @@ + +package koz01.java2.lab08; + +import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.Scene; +import javafx.stage.Stage; + +/** + * JavaFX App + */ +public class RemoteLoader extends Application { + + @Override + public void start(Stage primaryStage) { + try { + Parent root = FXMLLoader.load(getClass().getResource( + "RemoteLoader.fxml")); + Scene scene = new Scene(root); + primaryStage.setScene(scene); + primaryStage.show(); + } + catch (Exception e) { + e.printStackTrace(); + } + } + + public static void main(String[] args) { + launch(); + } + +} diff --git a/src/main/java/koz01/java2/lab08/RemoteLoaderControler.java b/src/main/java/koz01/java2/lab08/RemoteLoaderControler.java new file mode 100644 index 0000000..8a11cb6 --- /dev/null +++ b/src/main/java/koz01/java2/lab08/RemoteLoaderControler.java @@ -0,0 +1,73 @@ + +package koz01.java2.lab08; + +import java.io.ByteArrayInputStream; +import java.io.IOException; +import java.net.InetSocketAddress; +import java.nio.ByteBuffer; +import java.nio.channels.SocketChannel; + +import javafx.fxml.FXML; +import javafx.scene.control.Button; +import javafx.scene.control.TextField; +import javafx.scene.image.Image; +import javafx.scene.image.ImageView; +import lombok.extern.log4j.Log4j2; + +@Log4j2 +public class RemoteLoaderControler { + + @FXML + private ImageView imageView; + + @FXML + private TextField indexTextField; + + @FXML + private Button load; + + @FXML + private TextField adress; + + @FXML + private TextField port; + + private SocketChannel socketChannel; + + public void readButton() { + try { + ByteBuffer bb = ByteBuffer.allocate(4); + bb.putInt(Integer.parseInt(indexTextField.getText())); + bb.flip(); + socketChannel.write(bb); + bb.clear(); + socketChannel.read(bb); + bb.flip(); + int size = bb.getInt(); + bb = ByteBuffer.allocate(size); + while (bb.hasRemaining()) { + + socketChannel.read(bb); + } + bb.flip(); + imageView.setImage(new Image(new ByteArrayInputStream(bb.array()))); + } + + catch (IOException exc) { + log.error("read", exc); + } + + } + + public void connect() { + try { + socketChannel = SocketChannel.open(new InetSocketAddress(adress.getText(), + Integer.parseInt(port.getText()))); + indexTextField.setDisable(false); + load.setDisable(false); + } + catch (NumberFormatException | IOException exc) { + log.error("connect", exc); + } + } +} diff --git a/src/main/resources/koz01/java2/lab08/LocalLoader.fxml b/src/main/resources/koz01/java2/lab08/LocalLoader.fxml new file mode 100644 index 0000000..b588d08 --- /dev/null +++ b/src/main/resources/koz01/java2/lab08/LocalLoader.fxml @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.Label?> +<?import javafx.scene.control.TextField?> +<?import javafx.scene.image.ImageView?> +<?import javafx.scene.layout.AnchorPane?> + +<AnchorPane prefHeight="543.0" prefWidth="472.0" xmlns="http://javafx.com/javafx/15.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="koz01.java2.lab08.LocalLoaderControler"> + <children> + <ImageView fx:id="imageView" fitHeight="472.0" fitWidth="472.0" pickOnBounds="true" preserveRatio="true" /> + <TextField fx:id="indexTextField" layoutX="193.0" layoutY="503.0" prefHeight="26.0" prefWidth="73.0" /> + <Label layoutX="122.0" layoutY="503.0" prefHeight="26.0" prefWidth="51.0" text="Index" /> + <Button layoutX="299.0" layoutY="503.0" mnemonicParsing="false" onAction="#readButton" text="Načti" /> + </children> +</AnchorPane> diff --git a/src/main/resources/koz01/java2/lab08/RemoteLoader.fxml b/src/main/resources/koz01/java2/lab08/RemoteLoader.fxml new file mode 100644 index 0000000..366bd4c --- /dev/null +++ b/src/main/resources/koz01/java2/lab08/RemoteLoader.fxml @@ -0,0 +1,21 @@ +<?xml version="1.0" encoding="UTF-8"?> + +<?import javafx.scene.control.Button?> +<?import javafx.scene.control.Label?> +<?import javafx.scene.control.TextField?> +<?import javafx.scene.image.ImageView?> +<?import javafx.scene.layout.AnchorPane?> + +<AnchorPane prefHeight="636.0" prefWidth="472.0" xmlns="http://javafx.com/javafx/15.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="koz01.java2.lab08.RemoteLoaderControler"> + <children> + <ImageView fx:id="imageView" fitHeight="472.0" fitWidth="472.0" pickOnBounds="true" preserveRatio="true" /> + <TextField fx:id="indexTextField" disable="true" layoutX="207.0" layoutY="592.0" prefHeight="26.0" prefWidth="73.0" /> + <Label layoutX="81.0" layoutY="592.0" prefHeight="26.0" prefWidth="103.0" text="Index obrázku" /> + <Button fx:id="load" disable="true" layoutX="306.0" layoutY="592.0" mnemonicParsing="false" onAction="#readButton" text="Načti" /> + <Label layoutX="81.0" layoutY="531.0" text="Adresa" /> + <TextField fx:id="adress" layoutX="149.0" layoutY="526.0" prefHeight="26.0" prefWidth="131.0" /> + <TextField fx:id="port" layoutX="207.0" layoutY="560.0" prefHeight="26.0" prefWidth="73.0" /> + <Label layoutX="81.0" layoutY="565.0" prefHeight="16.0" prefWidth="46.0" text="Port" /> + <Button fx:id="connect" layoutX="306.0" layoutY="526.0" mnemonicParsing="false" onAction="#connect" text="Připojit" /> + </children> +</AnchorPane> -- GitLab