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

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

ただいまの
回答率

90.32%

  • JavaFX

    410questions

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

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

解決済

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 494

Miyahala

score 8

Javaを学習しています。
JavaFXでボタンをクイックする度にその時の現在時刻をリストに保存しつつ、TextAreaに表示させるプログラムを作っています。

現在時刻をリストに保存する所までは問題なく動作するのですが、ArrayListの中身をTextAreaに表示させる方法が色々実験してみましたがどうもうまくいきません。

以下のコードの実験①と②ではArrayListは機能しているのですが、書きだそうとするとTextAreaにはArrayListの最後尾の要素に格納された時刻しか受け渡すことが出来ません。実験③ではスイッチ文を用いて動作していますが、クイックされた数だけcaseを書かなくてはならず間延びしたコードになってしまいます。

/*
実験①
拡張for文でリストを回す。(一番簡単な方法)
 */
package test;

import java.time.LocalTime;
import java.util.ArrayList;
import java.util.Iterator;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.TextArea;
import javafx.scene.text.Font;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
 * @author test
 */
public class ArrayListの中身をJavaFXに表示させる実験 extends Application {

    //ArrayListで変数名はListとする、ジェネリクスはLocalTime型を指定
    ArrayList<LocalTime>List=new ArrayList<LocalTime>(); 
    //ArrayListで変数名はStringListとする、ジェネリクスはString型を指定
    ArrayList<String>StringList=new ArrayList<String>();
    //ボタンを配置
    Button btn = new Button("buttonのbtn");
    //テキストエリアを配置
    TextArea text=new TextArea("TextAreaのtext");
    //制御用にフィールドを準備
     int count;

 @Override
    public void start(Stage primaryStage) { 
        //ラムダ式でボタンを押された時のイベント処理         
        btn.setOnAction (event-> {
                 //現在時刻をListの要素に書き留める。                            
                 List.add(LocalTime.now());
                //制御用に要素数を獲得する
                 count=List.size();

    //実験① 拡張for文でリストを回す。(一番簡単な方法)
                for(LocalTime i:List){
                    System.out.println(count+"拡張for文で"+i);
                    text.setText(count+"拡張for文で"+i);
                      }
      }); 
/*結果はSystem.out.printlnでArrayListは機能している事を確認出来るが。
    TextAreaにはListの最後尾の要素に格納された時刻しか受け渡されていないことがわかる。*/                

        //VBox表示のレイアウト
        VBox root2=new VBox();
        Scene scene = new Scene(root2, 300, 250); 

        root2.setAlignment(Pos.CENTER);
        root2.setPadding(new Insets(10,10,10,10));
        root2.setSpacing(2.0);
        root2.getChildren().addAll(btn,text);

        primaryStage.setTitle("ArrayListの実験");
        primaryStage.setScene(scene);
        primaryStage.show();

        }
    /**
     * @param args
     */
    //JavaFXはmainメゾットから起動する。
    public static void main(String[] args) {
        launch(args);
    }    
}
//実験②
// イテレータを使用して一個づつ順に書き出す。
//   ここでは@Overrideより上部は書くのを省略しています

public void start(Stage primaryStage) { 
        //ラムダ式でボタンを押された時のイベント処理         
        btn.setOnAction (event-> {
                 //現在時刻をListの要素に書き留める。                            
                 List.add(LocalTime.now());
                //制御用に要素数を獲得する
                 count=List.size();

                 Iterator<LocalTime>it=List.iterator();
                 while(it.hasNext()){
                     LocalTime e=it.next();
                     //LocalTime型をString型に変換する。String型のローカル変数はtxtTimeとする
                      String txtTime=String.format("%02d:%02d:%02d",
                                                        e.getHour(),
                                                        e.getMinute(),
                                                        e.getSecond());

                     System.out.println(count+"イテレータで"+txtTime);                
                     text.setText(count+"イテレーターで"+txtTime);
                   }
                }); 
 //以下VBox表示のレイアウトは書くのを省略
  //実験結果は実験①と同じとなる。
 //実験③  スイッチ文を利用する。
 //   ここでは@Overrideより上部は書くのを省略しています。
                switch(count){
                    case 1://文末が" ; "ではなく" : "である事に要注意
                        System.out.println(count+"スイッチ文で"+List.get(0));
                        text.setText(count+"スイッチ文で"+List.get(0));
                        break;
                    case 2:
                        System.out.println(count+"スイッチ文で"+List.get(0));
                        System.out.println(List.get(1));
                        text.setText(count+"スイッチ文で"+List.get(0)+List.get(1));
                       break; 
                    case 3:
                        System.out.println(count+"スイッチ文で"+List.get(0));
                        System.out.println(List.get(1));
                        System.out.println(List.get(2));
                        text.setText(count+"スイッチ文で"+List.get(0)+List.get(1)+List.get(2));
                       break;
                    case 4:
                        System.out.println(count+"スイッチ文で"+List.get(0));
                        System.out.println(List.get(1));
                        System.out.println(List.get(2));
                        System.out.println(List.get(3));
                        text.setText(count+"スイッチ文で"+List.get(0)+List.get(1)+List.get(2)+List.get(3));
                       break;   
                } 
 //以下VBox表示のレイアウトは書くのを省略
 //結果は成功、ただしこのやり方ではコードが長くなる。


これをスッキリしたコードにするにはどうすればよいのでしょうか。
またこのやり方だとTextAreaの中で横に繋がって時刻が表示されてしまうので、改行をさせたいのです、そのやり方もどなたか教えていただけないでしょうか。
何卒お願いいたします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/23 23:06

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

    キャンセル

+1

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 23:15

    (A)ArrayListに含まれる全ての要素をTextAreaに書き出すということを行いたいと思っています。

    System.out.printlnの方ではうまく動作しているのに、setTextの方では最後尾の要素だけしか表示されないので考え込んでおります。

    キャンセル

  • 2018/05/23 23:18

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

    キャンセル

check解決した方法

0

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

public class ArrayListの全ての要素をTextAreaに設定する実験2 extends Application {

    ArrayList<LocalTime>List=new ArrayList<LocalTime>(); 
    Button btn = new Button("現在時刻をメモする");
    TextArea text=new TextArea("");

    //表示用にString型のフィールドを宣言,変数名はdisplayとする。
     String display="";//初期値として「""」を設定(これをしないとnullが表示されてしまう)

    @Override
    public void start(Stage primaryStage) { 

        btn.setOnAction (event-> {                           
                 List.add(LocalTime.now());

                  for(LocalTime i:List){
                      //「displayは、元のdisplayに、改行を加え、String.formatした「i」を加えたものです。」
                        display=display+"\r\n"+String.format("%02d:%02d:%02d",
                                                       i.getHour(),
                                                       i.getMinute(),
                                                       i.getSecond());                 
                         }

                  //for文のループを出た後でsetTextメソッドを呼び出し
                  text.setText(display);
                  //その後displayの中身を書き消しておく
                  display="";             
        }); 
/*成功!*/

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/05/30 22:35

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

    キャンセル

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

  • ただいまの回答率 90.32%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • JavaFX

    410questions

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