2017年08月21日

addListenerとaddEventHandler


テキストフィールドの値の変更って
textarea.valueProperty().addListener(~~);
で取れるけど、イベントと何がちがうの??っと疑問になりました。

マウスがボタンに乗ったぞソースコード
btn1.addEventHandler(MouseEvent.MOUSE_ENTERED,  new EventHandler() {
    @Override public void handle(MouseEvent e) {
        System.out.println("マウス乗った" + MouseEvent.MOUSE_ENTERED.getName());
        
    }
});

気持ち的にaddEventHandlerが基本でaddListenerってそれ専用のメソッドなのかなと思ったり。

テキストエリアの内容変更をaddEventHandlerでキャッチできるのでしょうか。
import javafx.scene.control.TextField;
TextField textarea = new TextField();

javafx.scene.input.InputEvent に
直系の既知のサブクラス:
ContextMenuEvent、DragEvent、GestureEvent、InputMethodEvent、KeyEvent、MouseEvent、TouchEvent
とある

このうちInputMethodEventを見てみると
コンポジションのテキスト(変換テキスト)が生成/変更/削除されたり、入力メソッドが結果テキストをコミットしたり、入力メソッドのキャレット位置が変更されると、このイベントがTextInputControlを拡張するNodeオブジェクトに配信されます。

これなんか近いね

つーことで
TextField textarea = new TextField();
textarea.addEventHandler(InputMethodEvent.INPUT_METHOD_TEXT_CHANGED,  new EventHandler() {
    @Override public void handle(InputMethodEvent e) {
        System.out.println("テキストが変更されたよ");
        System.out.println(e.getCommitted());
    }
});

これはだめです。INPUT_METHOD_TEXT_CHANGEDということで日本語入力などのIMEにて変換されるような文字がタイプされた場合にのみ発動
なので無変換で英数記号打ってもfireしません。


textarea.addEventHandler(Event.ANY,  new EventHandler() {
    @Override public void handle(Event e) {
        System.out.println("テキストが変更されたよ" + e.getEventType());
    }
});

これで確認した所KeyEvent.KEY_TYPEDやInputMethodEvent.INPUT_METHOD_TEXT_CHANGEDがfireしている
日本語や直接入力の場合とばらばらだ

addEventHandlerでやろうと思ったら大変だ。
うむ これは素直にtextarea.valueProperty().addListener(~~);でやったほうが良さそうだ・・・

投稿者 muuming : 10:11

java addListenerをラムダ式に書いてみるの巻

sl.valueProperty().addListener(new ChangeListener(){
	@Override
	public void changed(ObservableValue arg0, Number oldval, Number newval) {
		// TODO Auto-generated method stub
		System.out.println(arg0);System.out.println(oldval);System.out.println(newval);
	}
});


以下のようになるかな

sl.valueProperty().addListener(
	(ObservableValue arg0, Number oldval, Number newval)->{
		// TODO Auto-generated method stub
		System.out.println(arg0);System.out.println(oldval);System.out.println(newval);
	}
);

動いたよ。正解でした。




投稿者 muuming : 09:58 | コメント (0)

ラムダ式の書き方

メッソドが一つだけのインターフェイスの場合使える

本来
InterFace in = new InterFace(){
   public void method(String str){
    //処理
  }
}

と書くんだが、どうせ一つしかメソッドないんだし省略しちゃえってのがラムダ式

上記は
InterFace in = (String str) -> {
  //処理
};

とかけるってこと

投稿者 muuming : 08:33 | コメント (0)

2017年08月10日

javafx textfield

Button類は setOnAction で、javascriptで言うところのいわゆるonclickイベントリスナーをセットできる。

んではjavafx.scene.control.TextField、こいつのjavascriptで言うところのonchangeは?


TextField tx = new TextField();
tx.textProperty().addListener(new ChangeListener(){
	@Override
	public void changed(ObservableValue text, String oldval, String newval) {
		// TODO Auto-generated method stub
		System.out.println(text);System.out.println(oldval);System.out.println(newval);
	}
});


TextField にもsetOnActionあるけどこれはなになに?
「アクション・ハンドラは通常、ユーザーが[Enter]キーを押したときに呼び出されます。」ってあるからそういう事か。
ボタンにフォーカスしてEnterキーおしたらクリック時の動作と同じなんかな。
試してみたらフォーカスしてEnter押したらFireしました。


んではフォーカスあたったらってのはどうやるんだ?
これもonchangeと同じ感じ。TextFieldのfocus関連のプロパティにaddListenerメソッドがある。

TextField tx = new TextField();
tx.focusedProperty().addListener(new ChangeListener(){
	@Override
	public void changed(ObservableValue flag, Boolean oldflag, Boolean newflag) {
		// TODO Auto-generated method stub
		System.out.println(flag);System.out.println(oldflag);System.out.println(newflag);
	}
});



そいでは javafx.scene.control.Slider の場合のonchangeは?
これも同じような感じ

Slider slider = new Slider(0,10,2);
slider.valueProperty().addListener(new ChangeListener(){
	@Override
	public void changed(ObservableValue val, Number oldval, Number newval) {
		// TODO Auto-generated method stub
		System.out.println(val);System.out.println(oldval);System.out.println(newval);
	}
});

ただこれだと、スライダーが動く度に、動かしている途中で何度もfireされてしまう。
変更完了した時にfireさせるにはどうしたらよいのだろう?

!forcusか?
sl.focusedProperty().addListener(new ChangeListener(){
	@Override
	public void changed(ObservableValue arg0, Boolean oldval, Boolean newval) {
		// TODO Auto-generated method stub
		if(newval) {
			System.out.println("forcus start");
		}else {
			System.out.println("forcus change");
		}
	}
});

これだと、動作完了してマウス離してもforcus自体は外れないので、他の要素をクリックしないとfireしない。だめだ


見てみると valueChangingProperty() てのがある

sl.valueChangingProperty().addListener(new ChangeListener(
以下同じ

これでOKでした

では onmouseはどうなるのかな
button がわかりやすいのでそちらでマウス乗ったら文字変更的なのを作ってみる

見たところaddEventHandlerにて行うようだ。
クラスjavafx.scene.Nodeから継承だからjavafxのnodeなら全部このやり方だぬ

btn1.addEventHandler(MouseEvent.MOUSE_ENTERED,  new EventHandler() {
    @Override public void handle(MouseEvent e) {
        System.out.println("マウス乗った" + MouseEvent.MOUSE_ENTERED.getName());
        
    }
});


こんな感じ

EventTypeは階層構造になっていて以下のような形らしい
event_type_hierarchy.gif

投稿者 muuming : 12:24

2017年08月01日

JavaFXをEclipseで使う

Eclipseのメニューバーから

Help → Install New Software… を選択して Install ウィンドウを表示。

 

Work with: に

http://download.eclipse.org/releases/oxygen と入れると、
※ecripsのバージョンにあわせてね
しばらく待つとインストールできるツールの一覧が表示されます。

一覧の中から General Purpose Tools を展開して e(

投稿者 muuming : 12:32

2017年07月13日

javaのメモ

今更javaを学んで見る


アクセス修飾子
アクセス修飾子 概要
public すべてのクラスからアクセスできる
protected 現在のクラスとサブクラスからアクセスできる
なし 現在のクラスと同じパッケージのクラスからアクセスできる
private 現在のクラスからだけアクセスできる

classに修飾子が付かない場合はprivateでもなくprotectedでもない状態なんだって


public クラスは1つのファイルに1つしか書けない

投稿者 muuming : 11:38

2013年11月05日

java 比較

java 数値比較はPHPと同じ感じ

しかし文字列は・・・・
equalsを使う。

if (str1.equals(str2)){

んでもって 正規表現 preg_match的なものは
javascriptと似てるー

String str = "poebon";
String regex = "e.*o";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);

if (m.find()){
System.out.println("マッチしました");
}else{
System.out.println("マッチしません");
}

んでもって このmatcherで
System.out.println("マッチした部分は " + m.group() + " です");

とマッチした部分の全体が取得できる。

ただ、複雑なグループマッチングとかはどうするんだ・・・?
ともったら、もちろんあったー


String str = "2009year";
String regex = "(¥¥d+)(y)";
Pattern p = Pattern.compile(regex);

Matcher m = p.matcher(str);
if (m.find()){
String matchstr = m.group();
System.out.println(matchstr + "の部分にマッチしました");

System.out.println("group1:" + m.group(1));
System.out.println("group2:" + m.group(2));
}

なるほどなるほど

m.groupCount() でマッチしたグループの数がとれるんだって
for (int i = 0 ; i <= m.groupCount() ; i++){
System.out.println("group" + i + ":" + m.group(i));
}

などなど


小技としては グループ化したいけど別に使わねーよって時は
String regex2 = "(200(?:7|8|9))year";

とすれば拾わなくなってメモリの無駄遣いしなくてすむ

投稿者 muuming : 11:13 | コメント (0)

2013年11月01日

javaとPHPの配列とかとか


JAVAのオベンキョ中


PHPはてきとー言語なのでJAVAの配列で手こずり


PHPの配列は宣言も省けるし、配列も連想配列も関係ないし・・その配列数も可変だし、、、、


しかーしjavaの配列は厳しい というかこれが普通なのかも?


■まず配列

PHPの配列と結構似てるが、配列数を宣言時に決定しないといけない。


  String[] hairetsu = new String[10];

  int[] hairetsu = new int[10];



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

    hairetsu [i] = "データ_" + i;

  }


だがこれだとPHP感覚では使えない。


そこでこの配列を使いやすくしてくれてるリストというものが!


import java.util.*;

が必要ですよっと


宣言は


List<データ型> リストの名前 = new ArrayList<データ型>();


List<String> list = new ArrayList<String>();


てなかんじ


値の追加は

リストの名前.add( データ );


 


値の取得は

変数 = list.get( インデックス );


 


値の置き換えは

リストの名前.set( インデックス, 新しいデータ );


全部見るには


  for ( int i = 0; リストの名前.size(); ++i ) {

    System.out.println( list.get( i ) );

  }


ここまでリスト


--------------------------------------------


ここから連想配列的なマップ!


import java.util.*;

が必要


Map<String, String> map = new HashMap<String, String>();


データの格納

マップの名前.put( キー, データ );



データの取り出し

変数 = マップの名前.get( キー );



System.out.println( map.get( "lemon" ) );



全部処理


for ( キーのデータ型 key : マップの名前.keySet() ) {
データのデータ型 data = マップの名前.get( key );

// keyやdataを使った処理;
}

投稿者 muuming : 12:02 | コメント (0)

2008年11月18日

javascript でチェックボックスを配列に

JavaScriptでチェックボックスの値を受け取るには

の<input type="checkbox" name="order_no[]">時

// form_name
var form_name = 'order_no[]';

// length
alert('合計' + document.FM.elements[form_name].length + '個のチェックボックスがあります');

// value
value_array = new Array();
for (i=0; i if(document.FM.elements[form_name][i].checked == true){
value_array.push(document.FM.elements[form_name][i].value);
}
}
alert('合計' + value_array.length + '個チェックされています');
alert(value_array);


投稿者 muuming : 14:02 | コメント (0)

2008年09月09日

配列のキー取得

for (keys in json){
  alert(keys);
}

んー しらんかった・・

投稿者 muuming : 13:48 | コメント (0)

2007年11月20日

java try throw

修飾子 戻り値型 メソッド(引数リスト) {
try {
// 例外が発生する処理
} catch (例外型 変数) {
// 例外が発生した後の処理
} finally {
// 例外が発生してもしなくても実行する処理
}
}


--------------------------------例外処理が必須でコンパイルを通らない

import java.io.*;
class ThrowsException {
void excep() {
// FileNotFoundException が発生する可能性がある
// 例外処理は必須
FileReader obj = new FileReader("filename.txt");
}
}
class ThrowsExceptionDemo {
public static void main(String[] args) {
ThrowsException obj = new ThrowsException();
obj.excep();
}
}

------------------------通るように変更

import java.io.*;
class ThrowsException2 {
void excep() {
try {
FileReader obj = new FileReader("filename.txt");
} catch (FileNotFoundException e) {
System.out.println("ファイルが見つかりません。");
e.printStackTrace();
}
}
}
class ThrowsExceptionDemo2 {
public static void main(String[] args) {
ThrowsException2 obj = new ThrowsException2();
obj.excep();
System.out.println("例外処理はうまく行きましたか?");
}
}

修飾子 戻り値型 メソッド(引数リスト) throws 例外型リスト {
// 例外が発生する処理
}

投稿者 muuming : 13:40 | コメント (0)

java 文字列などの比較

if( pnt1.equals(pnt2) )

==ではないので注意


他演算子関係

投稿者 muuming : 11:32 | コメント (0)

java クラス new

IntStack ostack = new IntStack( args.length );

この様な形で オブジェクト生成
オブジェクト変数?の前にもクラス名をつけるところがPHPと違うぽい。

投稿者 muuming : 11:28 | コメント (0)

JAVA 配列

配列を入れるための変数を宣言し、配列の領域を確保し、確保した領域を宣言した変数に入れると言う操作をしなくてはなりません。

領域を確保する際には、どのくらいの大きさの配列か(何番目までデータを入れるか)を指定しなければなりませんが、配列を入れるための変数を宣言する際には、どのくらいの大きさかは宣言しなくても構いません

  //変数宣言
int a[];
  //10個まで配列使う
a = new int [10];

  ここでa[0] ~ a[9] まで配列ができたが このときa[10] にアクセスすると ぐるっト回って a[0] にアクセスすることになる。

//宣言と同時に初期化
int raikyaku[] = { 1,2,3,4,5 };

//配列の数
int a[] = new int[10];

for( i = 0 ; i < a.length

// // 配列の表示
showArray(a);
showArray(b);

// 配列のコピー
// 配列aの0番目からa.length個(すべて)を配列bの0番目へとコピーする
System.arraycopy(a, 0, b, 0, a.length);

//多次元配列
int a[][]; // 2次元配列を入れるための変数
a = new int[3][4]; // 3行4列の2次元配列領域を確保

a[0][0] = 10;
a[0][1] = 20;
a[1][2] = 30;
a[2][3] = 40;

int a[][] = new int[3][4]; // 変数宣言と領域確保を同時にしてもよい

a[0][0] = 10;
a[0][1] = 20;
a[1][2] = 30;
a[2][3] = 40;

投稿者 muuming : 10:09 | コメント (0)

java for例

for文は、前判定型であり、繰り返し処理に入る前に繰り返し条件をチェック

import java.io.*;

class Test{
public static void main(String args[]){
int n, t;

for( n = 1, t = 0 ; n <= 100 ; n = n + 1){
t = t + n;
}
System.out.println("1から100までの合計は"+t+"です");
}
}

投稿者 muuming : 10:06 | コメント (0)

java while 例

while文は、前判定型であり、繰り返し処理に入る前に繰り返し条件をチェックする。


import java.io.*;

class Test{
public static void main(String args[]){
int n, t;

n = 1;
t = 0;

while(n <= 100){
t = t + n;
n = n + 1;
}
System.out.println("1から100までの合計は"+t+"です");
}
}

-------------------------------------------------------------------------------------
do~while文は、後判定型であり、繰り返し処理を行った後に繰り返し条件をチェックする。

class Test{
public static void main(String args[]){
int n, t;

n = 1;
t = 0;

do{
t = t + n;
n = n + 1;
}while(n <= 100);
System.out.println("1から100までの合計は"+t+"です");
}
}

投稿者 muuming : 10:04 | コメント (0)

2007年11月19日

JAVAって

JAVAってPHPの30倍以上の速度らしい。

つことでやってみよう。

インスコ

http://java.sun.com/javase/

ダウンロードあたりから
ごにょごにょ同意したりして
Linux Platform - Java(TM) SE Development Kit 6 Update 3 の
Linux RPM in self-extracting file をダウン
ファイルはjdk-6u3-linux-i586-rpm.binですた。

これに実行権限つけて
chmod 755 jd~~

./jd~~ でインストール完了


と思ったが、centos では既にdcj ってのがインストールされており、
/usr/java/default/bin/javac にコマンドがある。

sun のやつに切り替えるために
sudo yum remove jdk 
アンインスコ

コマンド類にパスが通ってないので、
環境変数追加
.bashrc あたりにでも
JAVA_HOME="/usr/java/jdk1.5.0_04"
JAVA_PATH="$JAVA_HOME"
PATH="$JAVA_HOME/bin:$PATH"


これで開発環境のできあがり

投稿者 muuming : 15:19 | コメント (0)