changeset 0:80482e7dd872 default tip

Initial commit
author Hiroyuki Tamae <e165759@ie.u-ryukyu.ac.jp>
date Tue, 13 Feb 2018 16:46:55 +0900
parents
children
files .idea/vcs.xml OS_7.5_KeyRec.iml src/jp/ac/uryukyu/ie/e165759/Controller.java src/jp/ac/uryukyu/ie/e165759/Main.java src/jp/ac/uryukyu/ie/e165759/view.fxml
diffstat 5 files changed, 168 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.idea/vcs.xml	Tue Feb 13 16:46:55 2018 +0900
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project version="4">
+  <component name="VcsDirectoryMappings">
+    <mapping directory="$PROJECT_DIR$" vcs="hg4idea" />
+  </component>
+</project>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/OS_7.5_KeyRec.iml	Tue Feb 13 16:46:55 2018 +0900
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<module type="JAVA_MODULE" version="4">
+  <component name="NewModuleRootManager" inherit-compiler-output="true">
+    <exclude-output />
+    <content url="file://$MODULE_DIR$">
+      <sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
+    </content>
+    <orderEntry type="inheritedJdk" />
+    <orderEntry type="sourceFolder" forTests="false" />
+  </component>
+</module>
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jp/ac/uryukyu/ie/e165759/Controller.java	Tue Feb 13 16:46:55 2018 +0900
@@ -0,0 +1,116 @@
+package jp.ac.uryukyu.ie.e165759;
+import javafx.application.Platform;
+import javafx.event.ActionEvent;
+import javafx.fxml.FXML;
+import javafx.scene.control.*;
+import javafx.scene.control.Button;
+import javafx.scene.control.TextField;
+import javafx.scene.input.KeyEvent;
+import java.awt.AWTException;
+import java.util.ArrayList;
+
+public class Controller {
+
+    @FXML private CheckBox Thread1CB;     // Thread1の利用状況
+    @FXML private Button Button_Start;
+    @FXML private TextField type;
+    @FXML private TextField Retype;
+
+    private ArrayList<String> posX = new ArrayList<>(); // タイピングの記録用
+
+    /*
+        Thread1
+     */
+    private Rec Thread1;
+
+    @FXML
+    void ClickButtonStart(ActionEvent e){
+        if(this.Button_Start.getText().equals("Start")){
+            this.Button_Start.setText("Stop");
+            type.setText("");
+            Retype.setText("");
+            // タイピングデータのクリア
+            posX.clear();
+
+            // スレッドで処理開始
+            Thread1 = new Rec();
+            Thread1CB.setSelected(true);
+            Thread1CB.setDisable(true);
+            Thread1.start();
+
+        }else if(this.Button_Start.getText().equals("Stop")) {
+            this.Button_Start.setText("Start");
+
+            // 現在動いているスレッドに割り込みして中止
+            Thread1.interrupt();
+        }
+    }
+
+    @FXML
+    public void handleKey(KeyEvent event) {
+        try {
+            posX.add(event.getText());
+        } catch (NumberFormatException | NullPointerException ex) { }
+    }
+
+    /*
+        Draw  記録したカーソルの軌跡を再現する
+        引数 : sleep_ (記録した間隔と同期する)
+     */
+    private void Draw(int sleep_) throws AWTException  {
+        String text;
+
+        for (String aPosX : posX) {
+            try {
+                Thread.sleep(sleep_);   // 取得間隔分おやすみ
+            } catch (InterruptedException s) {
+                System.out.println("Interrupted!");
+            }
+            if (!aPosX.equals("~")) {    // 文字が打たれていない時間を除いて
+                text = Retype.getText() + aPosX;
+                Retype.setText(text);
+            }
+        }
+    }
+
+    /*
+        Rec タイピングの記録
+     */
+    public class Rec extends Thread {
+        private boolean isActive = true;    // スレッドがアクティブか
+        private void stopThread(){ this.isActive = false; }
+        private void startThread(){ this.isActive = true; }
+
+        public void run() {
+            int sleep;   // タイピングを取得する間隔
+            // 精度 : 1ms
+            sleep = 1;
+
+            while (this.isActive) {
+                try {
+                    posX.add("~");  // 何も打たれていない時の補完
+                    Thread.sleep(sleep); // sleep分待機
+
+                    // 割り込み処理(Stopボタンが押された時)
+                } catch (InterruptedException e) {
+                    try {
+                        Thread1.stopThread();   // Thread1を非アクティブ化
+                        Draw(sleep);    // タイピングを再現
+                    } catch (AWTException e1) {
+                        e1.printStackTrace();
+                    }
+                }
+            }
+        }
+    }
+
+    @FXML
+    private Button Button_Quit;
+
+    @FXML
+    protected void ClickButtonQuit(ActionEvent i){
+        if(this.Button_Quit.getText().equals("Quit")){
+            Platform.exit();    // プログラム終了
+        }
+    }
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jp/ac/uryukyu/ie/e165759/Main.java	Tue Feb 13 16:46:55 2018 +0900
@@ -0,0 +1,23 @@
+package jp.ac.uryukyu.ie.e165759;
+
+import javafx.application.Application;
+import javafx.fxml.FXMLLoader;
+import javafx.scene.Parent;
+import javafx.scene.Scene;
+import javafx.stage.Stage;
+
+public class Main extends Application {
+
+    @Override
+    public void start(Stage primaryStage) throws Exception{
+        Parent root = FXMLLoader.load(getClass().getResource("view.fxml"));
+        primaryStage.setTitle("OS7.5 KeyRec");
+        primaryStage.setScene(new Scene(root, 520, 250));
+        primaryStage.show();
+    }
+
+    public static void main(String[] args) {
+        launch(args);
+    }
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/jp/ac/uryukyu/ie/e165759/view.fxml	Tue Feb 13 16:46:55 2018 +0900
@@ -0,0 +1,11 @@
+<?import javafx.scene.control.Button?>
+<?import javafx.scene.layout.AnchorPane?>
+<?import javafx.scene.control.CheckBox?>
+<?import javafx.scene.control.TextField?>
+<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="600.0" prefWidth="1000.0" xmlns:fx="http://javafx.com/fxml" fx:controller="jp.ac.uryukyu.ie.e165759.Controller">
+    <Button fx:id="Button_Start" layoutX="40.0" layoutY="10.0" mnemonicParsing="false" onAction="#ClickButtonStart" text="Start" />
+    <Button fx:id="Button_Quit" layoutX="100.0" layoutY="10.0" mnemonicParsing="false" onAction="#ClickButtonQuit" text="Quit" />
+    <CheckBox fx:id="Thread1CB" layoutX="300.0" layoutY="14.0" mnemonicParsing="false" text="Thread1" disable="true"/>
+    <TextField fx:id="type" onKeyPressed="#handleKey" layoutX="40.0" layoutY="60.0" prefWidth="430.0" prefHeight="50" />
+    <TextField fx:id="Retype" editable="false" layoutX="40.0" layoutY="130.0" prefWidth="430.0" prefHeight="50" />
+</AnchorPane>
\ No newline at end of file