Javaを学習しています。
JavaFXでボタンをクイックする度にその時の現在時刻をリストに保存しつつ、TextAreaに表示させるプログラムを作っています。
現在時刻をリストに保存する所までは問題なく動作するのですが、ArrayListの中身をTextAreaに表示させる方法が色々実験してみましたがどうもうまくいきません。
以下のコードの実験①と②ではArrayListは機能しているのですが、書きだそうとするとTextAreaにはArrayListの最後尾の要素に格納された時刻しか受け渡すことが出来ません。実験③ではスイッチ文を用いて動作していますが、クイックされた数だけcaseを書かなくてはならず間延びしたコードになってしまいます。
Java
1/* 2実験① 3拡張for文でリストを回す。(一番簡単な方法) 4 */ 5package test; 6 7import java.time.LocalTime; 8import java.util.ArrayList; 9import java.util.Iterator; 10import javafx.application.Application; 11import static javafx.application.Application.launch; 12import javafx.geometry.Insets; 13import javafx.geometry.Pos; 14import javafx.event.ActionEvent; 15import javafx.event.EventHandler; 16import javafx.scene.Scene; 17import javafx.scene.control.Button; 18import javafx.scene.control.TextArea; 19import javafx.scene.text.Font; 20import javafx.scene.layout.StackPane; 21import javafx.scene.layout.VBox; 22import javafx.stage.Stage; 23 24/** 25 * @author test 26 */ 27public class ArrayListの中身をJavaFXに表示させる実験 extends Application { 28 29 //ArrayListで変数名はListとする、ジェネリクスはLocalTime型を指定 30 ArrayList<LocalTime>List=new ArrayList<LocalTime>(); 31 //ArrayListで変数名はStringListとする、ジェネリクスはString型を指定 32 ArrayList<String>StringList=new ArrayList<String>(); 33 //ボタンを配置 34 Button btn = new Button("buttonのbtn"); 35 //テキストエリアを配置 36 TextArea text=new TextArea("TextAreaのtext"); 37 //制御用にフィールドを準備 38 int count; 39 40 @Override 41 public void start(Stage primaryStage) { 42 //ラムダ式でボタンを押された時のイベント処理 43 btn.setOnAction (event-> { 44 //現在時刻をListの要素に書き留める。 45 List.add(LocalTime.now()); 46 //制御用に要素数を獲得する 47 count=List.size(); 48 49 //実験① 拡張for文でリストを回す。(一番簡単な方法) 50 for(LocalTime i:List){ 51 System.out.println(count+"拡張for文で"+i); 52 text.setText(count+"拡張for文で"+i); 53 } 54 }); 55/*結果はSystem.out.printlnでArrayListは機能している事を確認出来るが。 56 TextAreaにはListの最後尾の要素に格納された時刻しか受け渡されていないことがわかる。*/ 57 58 //VBox表示のレイアウト 59 VBox root2=new VBox(); 60 Scene scene = new Scene(root2, 300, 250); 61 62 root2.setAlignment(Pos.CENTER); 63 root2.setPadding(new Insets(10,10,10,10)); 64 root2.setSpacing(2.0); 65 root2.getChildren().addAll(btn,text); 66 67 primaryStage.setTitle("ArrayListの実験"); 68 primaryStage.setScene(scene); 69 primaryStage.show(); 70 71 } 72 /** 73 * @param args 74 */ 75 //JavaFXはmainメゾットから起動する。 76 public static void main(String[] args) { 77 launch(args); 78 } 79}
Java
1 2//実験② 3// イテレータを使用して一個づつ順に書き出す。 4// ここでは@Overrideより上部は書くのを省略しています 5 6public void start(Stage primaryStage) { 7 //ラムダ式でボタンを押された時のイベント処理 8 btn.setOnAction (event-> { 9 //現在時刻をListの要素に書き留める。 10 List.add(LocalTime.now()); 11 //制御用に要素数を獲得する 12 count=List.size(); 13 14 Iterator<LocalTime>it=List.iterator(); 15 while(it.hasNext()){ 16 LocalTime e=it.next(); 17 //LocalTime型をString型に変換する。String型のローカル変数はtxtTimeとする 18 String txtTime=String.format("%02d:%02d:%02d", 19 e.getHour(), 20 e.getMinute(), 21 e.getSecond()); 22 23 System.out.println(count+"イテレータで"+txtTime); 24 text.setText(count+"イテレーターで"+txtTime); 25 } 26 }); 27 //以下VBox表示のレイアウトは書くのを省略 28 //実験結果は実験①と同じとなる。 29 30
Java
1 //実験③ スイッチ文を利用する。 2 // ここでは@Overrideより上部は書くのを省略しています。 3 switch(count){ 4 case 1://文末が" ; "ではなく" : "である事に要注意 5 System.out.println(count+"スイッチ文で"+List.get(0)); 6 text.setText(count+"スイッチ文で"+List.get(0)); 7 break; 8 case 2: 9 System.out.println(count+"スイッチ文で"+List.get(0)); 10 System.out.println(List.get(1)); 11 text.setText(count+"スイッチ文で"+List.get(0)+List.get(1)); 12 break; 13 case 3: 14 System.out.println(count+"スイッチ文で"+List.get(0)); 15 System.out.println(List.get(1)); 16 System.out.println(List.get(2)); 17 text.setText(count+"スイッチ文で"+List.get(0)+List.get(1)+List.get(2)); 18 break; 19 case 4: 20 System.out.println(count+"スイッチ文で"+List.get(0)); 21 System.out.println(List.get(1)); 22 System.out.println(List.get(2)); 23 System.out.println(List.get(3)); 24 text.setText(count+"スイッチ文で"+List.get(0)+List.get(1)+List.get(2)+List.get(3)); 25 break; 26 } 27 //以下VBox表示のレイアウトは書くのを省略 28 //結果は成功、ただしこのやり方ではコードが長くなる。 29
これをスッキリしたコードにするにはどうすればよいのでしょうか。
またこのやり方だとTextAreaの中で横に繋がって時刻が表示されてしまうので、改行をさせたいのです、そのやり方もどなたか教えていただけないでしょうか。
何卒お願いいたします。
回答3件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/05/23 14:15
2018/05/23 14:18