2016年11月30日水曜日

[実装メモ] 割とfxmlを読ませるためのコードにミスる人が見られるので私がシステムを作ったときのコードを公開しておく

javafxのfxmlのloaderは割と記述の順番間違えるとエラー吐いてめんどうです.

私がJavaFXでシステム組んだときのコード例を貼っておきます.

public class Main extends Application {
    @Override
    public void start(Stage primaryStage) {
        try {
            Pane root = FXMLLoader.load(getClass().getResource("filename.fxml"));
            Scene scene = new Scene(root);
            scene.getStylesheets().add(getClass().getResource("filename.css").toExternalForm());        
            primaryStage.setScene(scene);
            primaryStage.setResizable(false);
            primaryStage.setTitle("Title name");
            primaryStage.show();
            
        
        } catch(Exception e) {
            e.printStackTrace();
        }
    }
   
    public static void main(String[] args) {
        //System.out.println(System.getProperties().get("javafx.runtime.version"));
        launch(args);
    }
   
}


2016年11月8日火曜日

[指導に使えたらいいなノート] 再帰メソッドが難しいなら数IIまで戻ればいいじゃない

再帰メソッド呼び出しは難しいですよね.
 私も悩みました.
 概念もプログラミング規則もわからない状態だとどっちがダメなのかわからないので数学IIの自分がわかっているだろうレベルまで戻りましょう.
こんな漸化式を計算することを考える.
 a1=3
 an = a_n-1 + 2
 (tex記法を利用できるようにしたらきれいにします)
 これで例えばa4を求めるとこうなりますよね.
 a4 = a3 + 2
 a3 = a2 + 2
 a2 = a1 + 2

 ここまできてa1 = 3だから
 a2 = 3 + 2 = 5
 a3 = 5 + 2 = 7
 a4 = 7 + 2 = 9
 と逆戻りしますよね.
再帰メソッド呼び出しでも同じことがわけです.
 
これを実現するのが以下のコードです.
 public class recursion_ex{

    public static void main(String[] args){

        int n = 4;
        System.out.println(calc_recursion(n));

    }


   /*
     a1 = 3;
     an = 前項 + 2;
     を計算
   */

    static int calc_recursion(int n){

      if(n == 1){
            return 3;
        } else {
          return calc_recursion(n-1) + 2;
        }

   }

}


ソースコードのダウンロードはこちら
 recursion_ex.java 


例のごとく質問があれば直接おねがいします.

2016年11月6日日曜日

[指導に使えたらいいなノート] メソッドの使い方がわからないなら簡単な例で…

メソッドの使い方がよくわからないという質問はよく受けます.
なんか教本の例も難しい気がするんですよね.

みんながひと目で見てわかる計算をまずはメソッドを利用して書いてみるといいと思うんですよね.

メソッドわからん人は以下の2数の足し算プログラムが同じ結果になることを確かめるといいと思います.


public class sum1{

    public static void main(String[] args){

   int a = 3;
     int b = 2;

     int sum = 0;

     sum = a+b;

     System.out.println(sum);
  }

}

ソースファイルをダウンロード
sum1.java


public class sum2{

    public static void main(String[] args){

     int a = 3;
     int b = 2;

     int sum = 0;

     sum = add(a,b);

     System.out.println(sum);
    }

   static int add(int a, int b){
         return a+b;
     }
}
ソースファイルをダウンロード
sum2.java


当学部の後輩は質問があれば直接わたしのところまで

2016年11月5日土曜日

[指導に使えたらいいなノート] while文とfor文の性格の違いをわかってほしいサンプルコード

多くをここで語ると関係各所の方に怒られそうなのでソースコードを載せるだけ表現してみる.
このコードを見てwhile文とfor文で等価なものをどうやって書くかと,どういうときにwhileでこういうときにforがいいなとかわかってもらえたら嬉しいでござる…


public class sample2{
    public static void main (String[] args){
       
        int i = 0;
        int n = 10;
        int sum1 = 0;
        int sum2 = 0;
       
        while(i<n){
            sum1 += i;
            i++
        }
       
        for(int j = 0;j<n;j++){
            sum2 += j;
        }
       
        System.out.println(sum1);
        System.out.println(sum2);
       
       
    }
}

着目してほしいのは各文の(  )の中に何を書いているかについて.
for(;;)みたいにかけるけどそれは別のお話ということで…


うちの学部の後輩が見ていたら質問は直接私のところまで

2016年7月30日土曜日

[実装メモ]setScrollTop()を使いたければAppendTextはだめ


AppendText()を利用してTextAreaにsetScrollTop()を利用するとAppendText()のせいでうまく適用されない.
(参考ページではdelayと表現されている)
なので, setText()を用いて以下のように書く

TextArea hogehoge = new TextArea();
hogehoge.setText("First Line);
hogehoge.setText(hogehoge.getText() + "Second Line");

これでdelayがなくなり, setScrollTop()を利用できるようになる.

参考
https://bugs.openjdk.java.net/browse/JDK-8134661

2016年7月25日月曜日

[実装メモ] JavaFXにてcanvasの内容を消す方法

GUIプログラミングで描画系命令はちゃんとリセットしてあげないと残ったままでカオスになる.
JavaFXでも同様である.

canvasの内容を消すには以下のようにする.

Canvas canvasname;
GraphicsContext gc = canvasname.getGraphicsContent2D();

gc.clearRect(0,0, canvasname.getWidth(), canvas.getHeight());

このようにするとcanvasが真っ白になる.


参考
http://stackoverflow.com/questions/27203671/javafx-how-to-clear-the-canvas

[実装メモ] JavaFXのTextAreaで1行の高さを取りたい時

JavaFXでテキストエリアを装飾したいときなど1行の高さを知りたい時のメモ


//TextAreaの準備
TextArea hogehoge = new TextArea();
hogehoge.appendText("test");

//TextAreaのテキストがある部分の高さをのみを持ってくる
Text text = (Text)hogehoge.lookup(".text");
Double textHeight = text.getBoundsInLocal().getHeight();

こうすることでテキストエリアではなくテキストエリアのテキストがある部分の高さを持ってこれる.
これを行数で割れば1行の高さを求めることができる.

これで環境に依存することなくテキストエリアを装飾することが可能になる.


/*
開発環境のMBPでは1行が17px, 利用者の環境の想定となるUbuntuは13pxだった
lookupメソッドの存在と引数がわからんとどうにもうまくできんぞこれ…
*/


参考ページ
http://stackoverflow.com/questions/27818470/javafx-get-line-height-of-textarea

2016年5月3日火曜日

.jar ファイルがGUIからダブルクリックで実行できないときに試したい3つのこと

どうもよっさん似の大学院生です
(本家よっさんさんから苦情来たらどうしようとドグマさんが危惧してたような...?)


さて,一発目ですが,私が自大学の後輩に質問されたときにあまり日本語ではいい情報が得られなかったのでどんなことをして解決したのかまとめておこうと思います.

環境はうちの学部の今年の新入生モデルでOSはWin10です
ざっくりとしすぎて申し訳ないですが,Win10というだけで割と充分な情報かなと思います.

ことの発端はとある課題でJREをインストールして.jarファイルを実行する必要があるのですが,その時にファイルブラウザからダブルクリックで起動しようとエラーが.


jarファイルが実行できないエラーの画像
図1 出てきたエラー
(個人情報の部分は白抜き)
出てきたエラーはこのような形.
「Javaをインストールできません.次のスイッチにエラーがあります」
というメッセージがでます.

Yahoo知恵袋などで少し情報が出てきたのですが,基本的にアンインストールしろしか乗ってなかったので以下にやったことをまとめておきます.



.jar ファイルがGUIからダブルクリックで実行できない時に試したい3つのこと

1. JAVA JREが正しくインストールされているか確認する


Oracleのページに行き,Javaのバージョンを調べるページにいきましょう.
図2のようなページに行くと思うのでチェックを実行します.

図2 Javaのバージョン確認ページ

実行をすると図3のような結果がでます.
(長らくアップデートを忘れていてかなりバージョンに開きがでてますね...)

図3 確認結果

Javaが正しくインストールできていなければ何かしらの表記が出るはずです.
これによってJavaが動かせる環境にあるか調べることができるはずです.

2. コマンドラインから .jarファイルが起動できるか確かめてみる

GUIで起動できないのならCUIから起動して見ましょう.
windowsなのでコマンドプロンプトでいいと思います.
JREをインストールした時点でjavaコマンドが使えるようになっているようです.

コマンドプロンプトの諸所の説明は省きます.

javaコマンドを使って.jarファイルを実行するには,

java -jar [.jarファイル]

コマンドを打てば起動できます.
CUIならば起動オプションを自分で設定できるためいろいろな検証ができると思います.

今回はこれで起動ができたので,レジストリの設定がおかしいではないかと疑いをかけました.

3. jarfixというソフトを試してみる

 jarfixはデンマーク人のデベロッパーが作成したツールです.

jarfixの公式サイトの記述によると,

If you doubleclick on a jar file, and your Java application does not start, your .jar association has been hijacked. You can fix the problem with Jarfix.
The problem ...
The root cause for the problem above is, that a program has stolen the .jar association. If you have installed the Java Runtime Environment the first time, the file type called "jar" is assigned to javaw.exe correctly. "jar" is an abbreviation for "java archive" and javaw.exe is the correct program to execute a .jar. However, on Windows any program can steal a file type at any time even if it is already associated with a program. Many zip/unzip programs prefer to do this, because a jar is stored in the .zip format.  If you doubleclick on a .jar, your pack program opens the file, rather than javaw runs the program, because your pack program ignores the meta information which are also stored in a .jar. In the Oracle bug database there is the low-priority report 4912211 "add mechanism to restore hijacked .jar and .jnlp file extensions", but it has been closed as "Closed, Will Not Fix".
The workaround ...
Reinstall the Java Runtime Environment or fix the Windows Registry manually each time this problem occurs.
The solution ...
You can fix this problem very easy with the small but reliable jarfix.exe program. Just doubleclick on it to restore the .jar association with javaw.exe. 
 ということだそうです.
簡単にいうと, 諸所の都合で.jarファイル関連の設定がハイジャックされておかしくなることあるけど,俺のツールを使えば直してくれぜ!とのこと.
hijackedという表現がなんとも素敵ですね.

今回ダメ元で試したらGUIから.jarファイルを動かせるようになりました.

使い方はとっても簡単.起動して図4が出たら終わりです.

Jarfix Success Dialog
図4 jarfix利用したときの画面
(From his official jarfix webpage)


 この問題,マインクラフトの.jarファイルを起動する際にも良く出てくるみたいです.
マインクラフトで問題が起こっている方,試してみたらいかがでしょうか?