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

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

新規登録して質問してみよう
ただいま回答率
85.50%
JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

Q&A

解決済

3回答

1500閲覧

ArrayListの中身をJavaFXのTextAreaに表示させる方法がわからない。改行の仕方がわからない。

Miyahala

総合スコア19

JavaFX

JavaFXとは、Java仮想マシン上で動作するリッチインターネットアプリケーション (RIA) のGUIライブラリです。Swingとは異なり、FXMLと呼ばれる XMLとCSSを併用してデザインを記述します。

0グッド

0クリップ

投稿2018/05/23 13:39

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の中で横に繋がって時刻が表示されてしまうので、改行をさせたいのです、そのやり方もどなたか教えていただけないでしょうか。
何卒お願いいたします。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ArrayListの中身をJavaFXのTextAreaに表示させる方法

この要件そのものが曖昧だと思います。「ArrayListの中身」という表現では大抵のプログラマーは満足しません。例えば表示対象としたい要素はどれですか?

(A) ArrayListに含まれる全ての要素
(B) ArrayListに最後に追加された要素(末尾の要素)だけ
(C) ArrayListの最初に追加された要素(先頭の要素)だけ

要件がはっきりしないとコードが適切かどうかはわかりません。仮に(A)だと仮定します。なぜなら(1)(2)で要素数分だけループしているからです。まさか(B)(C)が目的ならループは考えないだろうと思います。ただ(3)でうまくいくという意味がわかりませんが・・・

さてうまくいかないと思える原因はTextAreaのsetTextメソッドの機能を勘違いしておられるからだと思います。setTextはTextAreaに現在設定されている表示内容を「無条件に全部捨てて」指定した文字列を新たに設定しなおすメソッドです。

以上に基づきなぜ期待どおりにならないのかを考えてみるとよいと思います。

ちなみに上記の(A)~(C)のどれなんでしょうか・・・自分にはよく分かりません。質問文から確信できないのです。

投稿2018/05/23 14:02

KSwordOfHaste

総合スコア18392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Miyahala

2018/05/23 14:15

(A)ArrayListに含まれる全ての要素をTextAreaに書き出すということを行いたいと思っています。 System.out.printlnの方ではうまく動作しているのに、setTextの方では最後尾の要素だけしか表示されないので考え込んでおります。
KSwordOfHaste

2018/05/23 14:18

そういうことなら自分の回答にかいたsetTextの機能を考えればうまくいかない原因がわかる気がするのですが・・・いかがでしょう?
guest

0

文字列の後尾に"\r\n"を付ければいいのでは

投稿2018/05/23 13:52

y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Miyahala

2018/05/23 14:06

ありがとうございます。 おかげさまで改行の仕方については解決することが出来ました。
guest

0

自己解決

ようやく解決しました、モニターの前で声を上げて喜んでしまいました。
アドバイスを与えて下さった方にこの場を借りて感謝いたします。

Java

1public class ArrayListの全ての要素をTextAreaに設定する実験2 extends Application { 2 3 ArrayList<LocalTime>List=new ArrayList<LocalTime>(); 4 Button btn = new Button("現在時刻をメモする"); 5 TextArea text=new TextArea(""); 6 7 //表示用にString型のフィールドを宣言,変数名はdisplayとする。 8 String display="";//初期値として「""」を設定(これをしないとnullが表示されてしまう) 9 10 @Override 11 public void start(Stage primaryStage) { 12 13 btn.setOnAction (event-> { 14 List.add(LocalTime.now()); 15 16 for(LocalTime i:List){ 17 //「displayは、元のdisplayに、改行を加え、String.formatした「i」を加えたものです。」 18 display=display+"\r\n"+String.format("%02d:%02d:%02d", 19 i.getHour(), 20 i.getMinute(), 21 i.getSecond()); 22 } 23 24 //for文のループを出た後でsetTextメソッドを呼び出し 25 text.setText(display); 26 //その後displayの中身を書き消しておく 27 display=""; 28 }); 29/*成功!*/

なにぶん学習中の人間が書いたコードとコメントですのでプロの方から見れば、これはないだろうというものもあると思います。そうした点があれば指摘してくだされば私としては勉強となりとても助かります。

投稿2018/05/30 12:59

Miyahala

総合スコア19

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

KSwordOfHaste

2018/05/30 13:35

最初はベストな方法より「自分で期待したとおりの結果を得る」こと優先でよいと思います。 なお、Javaの日付・時刻関連のクラスはあきれるほど種類があるため、いざ使おうとするとどれを使えばいいかわからないほどです。以下がまとまってると思います。文字列化する方法も色々紹介されてます。 http://www.ne.jp/asahi/hishidama/home/tech/java/datetime.html
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問