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 extends Number> 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 extends Number> 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 extends String> 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 extends Boolean> 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 extends Number> 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 extends Boolean> 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は階層構造になっていて以下のような形らしい ![]()
投稿者 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
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"
これで開発環境のできあがり