質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.21%

JavaとJavaFXの連動について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 422

junkjunk

score 26

前提・実現したいこと

JavaプログラムとJavaFXで作成したGUIを繋げたい

現在、指定したフォルダ下の複数ファイルを圧縮するプログラムを作成しています。
プログラム自体はeclipseを用いてJavaで書いたのですが、他の人が簡単にプログラムを動かせるように、圧縮元のファイルアドレスや圧縮先のフォルダアドレスなどを入力出来るGUIでプログラムを動かしたいと考えています。
GUIはeclipseからJavaFXプログラムを作成→scene builderを起動して作成しました。

その後、JavaFXとJavaを連動させて(JavaFXのTextFiledで読み込んだ値をJavaに引き渡すなど)プログラムをGUIで動かそうと思ったのですが、調べてみたところJavaとJavaFXは完全に独立していた言語で、変数の参照などは出来ないように読み取れたんですが実際にそうなんでしょうか?

また、その場合Javaプログラムの中身自体をJavaFXで書き直す必要があると思うのですが、TextFiledで読み込んだ値を変数に納めてプログラム内で計算に使うにはどのようにすればいいのか、サイトを探してもまだ見つけられていないので参考になるようなサイトがあれば教えて頂きたいです。

よろしくお願い致します。

import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Scanner;

public class a {
    public static void main(String[] args) {

        try {    //最後にfinally節でclose処理したい(出来ない)

    //////////保存先のディレクトリの作成
            //    Windows Vista 以降での仕様(UAC)でシステムルートドライブ(C:\)には書き込めない(管理者権限の昇格が必要)のでとりあえずD:に作成
            //"D:\\test"にするとファイル名が\\testになる

            System.out.println("新しく作成するディレクトリのアドレスを入力してください。");

            //Scannerで入力を受け付け

            Scanner scan1 = new Scanner(System.in);

            //nextメソッドで入力された文字の読み取り
            //nextは文字を文字列として読み込み、nextIntは数値として読み込み
            String str1 = scan1.next();

            System.out.println("入力されたアドレス:" +  str1 + "");
            //scan1.close();

            //Fileクラスのオブジェクトを生成
            File newdir = new File(str1);

            if(newdir.exists()) {
              System.out.println("既に存在しているディレクトリです");
            }else if (newdir.mkdir()){
              System.out.println("ディレクトリの作成に成功しました");
            }else{
              System.out.println("ディレクトリの作成に失敗しました");
            }        


            //File newdir = new File("D:\\test\\sub");

            //if (newdir.mkdir()){
              //System.out.println("ディレクトリの作成に成功しました");
            //}else{
              //System.out.println("ディレクトリの作成に失敗しました");
            //}            


    /////////ファイルのコピー    
            System.out.println("ログファイルのあるアドレスを入力してください");
            //Fileクラスのオブジェクトを作成
            Scanner scan2 = new Scanner(System.in);
            String str2 = scan2.next();
            System.out.println("入力されたアドレス:" +  str2 + "");


            File dir = new File(str2);
            //listFiles:指定したディレクトリに含まれるファイルやディレクトリを配列で返す
            File[] list = dir.listFiles();

            //nullチェック
            //listfilesは指定したパス名がディレクトリを示さない場合や入出力エラーが発生した場合にnullを返す
            //null状態のままオブジェクト配列を参照するとjava.lang.NullPointerExceptionの例外が発生
            if(list != null) {
                //読み込んだファイルやディレクトリの数を表示
                System.out.println("OK");
            } else {
                System.out.println("null");
            }

            //最終更新日時表示書式
            //SimpleDateFormat(String)で指定されたパターン、デフォルトのロケール、日付フォーマット記号を持つ、オブジェクトを生成
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");

            //CalendarクラスやDateクラスは月を0~11で表すため一カ月ずれる!!
            //日時の設定
            Calendar start = Calendar.getInstance();
            System.out.println("取得したいログの開始時間を入力してください(年、月、日、時間、分、秒)");
            int scanstart[] = new int[6];
            Scanner scst = new Scanner(System.in);
            for(int i = 0; i < scanstart.length; i++) {
                scanstart[i] = scst.nextInt();
            }
            //scst.close();

            //start.set(2019, 4, 8, 6, 00, 00);
            start.set(scanstart[0],scanstart[1],scanstart[2],scanstart[3],scanstart[4],scanstart[5]);

            //日時の設定
            Calendar end = Calendar.getInstance();
            System.out.println("取得したいログの終了時間を入力してください(年、月、日、時間、分、秒)");
            int scanend[] = new int[6];
            Scanner scend = new Scanner(System.in);
            for(int i = 0; i < scanend.length; i++) {
                scanend[i] = scend.nextInt();
            }
            //sced.close();

            //end.set(2019, 4, 8, 12, 00, 00);
            end.set(scanend[0],scanend[1],scanend[2],scanend[3],scanend[4],scanend[5]);

            for (int i=0; i<list.length; i++) {

                // ファイルの最終更新日時(タイムスタンプ)を取得
                // 1970年1月1日0時0分0秒からの経過ミリ秒
                long lastModified = list[i].lastModified();

                //最終更新日時書式整形
                //String lastModifiedStr = sdf.format(lastModified);

                System.out.println(list[i]);
                //System.out.println(lastModifiedStr);

                //ファイルのコピー
                Path sourcePath = Paths.get(list[i].getPath());
                Path destinationPath = Paths.get(str1 + "\\" + list[i].getName() + ".txt");

                //あsファイルの更新日時をlong型からCalendar型に変換
                Calendar source = Calendar.getInstance();
                    //setTimeInMillis:Calendar の現在時刻を、指定された long 値から設定
                source.setTimeInMillis(lastModified);



                //cal1.compareTo(cal2)
                //同じなら0、cal1過去・cal2(引数)が未来なら負数1、cal1が未来なら正数を返す
                int diff1 = source.compareTo(start);
                int diff2 = source.compareTo(end);

                if(diff1 > 0 && diff2 < 0) {
                //ファイルのコピー
                    try {
                        Files.copy(sourcePath,destinationPath);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }

                //c_zip.zip(
                        //"D:\\test\\subzip.zip", "sourcePath");


            }
            //Zip化:ファイルの更新日時がプログラムの更新日時を上書きしてる
            ZipCompressUtils.compressDirectory("D:\\test\\subzip.zip", str1);



        } finally {
            //scend.close();
        }
    }

}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2019/06/15 20:07

    連携云々よりスコープを勉強してからのほうがいいかと
    JavaFX(ライブラリ)

    キャンセル

  • junkjunk

    2019/06/17 10:19

    コメントありがとうございます。
    asahina1979さんのコメントを参考に調べてみましたが、
    https://docs.oracle.com/javase/jp/8/javafx/get-started-tutorial/jfx-overview.htm
    こちらのサイトを読む限りでは「JavaFXライブラリはJava APIとして記述されているため、JavaFXアプリケーション・コードは任意のJavaライブラリのAPIを参照できます。たとえば、JavaFXアプリケーションでJava APIライブラリを使用して、ネイティブなシステム機能にアクセスし、サーバー・ベースのミドルウェア・アプリケーションに接続できます。」との記述より、JavaFXからJava APIのクラスを参照出来ると認識しました
    が、以下のサイトによると
    http://msugai.fc2web.com/java/scope.html
    「変数は宣言された場所以外からはアクセスできません。あるメソッド内で宣言されればその変数名は当該メソッド内でしか有効ではないということです。別のメソッドで同じ変数名を参照しても、全く別の変数が参照されます。」との記述からクラスは参照出来ても同じ変数として扱うことが出来ない、と読み取れるのですが合っているでしょうか?

    引数を渡して変数をやり取りすれば出来そうな気がしてしまうのですが、検討違いでしたらすみません。

    キャンセル

回答 1

check解決した方法

0

JavaFXのFXMLコントローラーにプログラムを記述することによりテキストの読み込みなど行うことが出来ました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.21%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る