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

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

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

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

2454閲覧

javafx TextAreaへの文字表示で1つのテキストエリアに複数のテキストを表示させたい

KosukeDayo_

総合スコア5

JavaFX

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

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/04/28 09:54

前提・実現したいこと

javafxを使ってパズルゲームを作成しています。
パズルが動いた時の動作(横に移動など)を履歴としてテキストエリアに保存し、テキストが10行以上になったら一番古いもの(最初は1行目)を削除してその下に履歴を入れるという仕様にしたいのですがなかなか上手くいきません。この仕様を満たすにはどうしたらよいでしょうか?

記述したソースコードでは履歴が10行以上になるとテキストエリアが大きくなり、古いものは消えない仕様になっています。

該当のソースコード

//gameHistoryがテキストエリアのfxidです。

String up = (count + "手目: " + "ボタン" + Btn + "が上に移動" + "\n");
String down = (count + "手目: " + "ボタン" + Btn + "が下に移動" + "\n");
String right = (count + "手目: " + "ボタン" + Btn + "が右に移動" + "\n");
String left = (count + "手目: " + "ボタン" + Btn + "が左に移動" + "\n");

//押したボタンと空白のボタンのX座標が同じときのみ実行(縦の操作) if (clickedBtn.getLayoutX() == button16.getLayoutX()) { moveCount.setText(count + "手目"); count++; //押したボタンと空白のボタンが隣接(下) if (clickedBtn.getLayoutY() == button16.getLayoutY() - 60) { clickedBtn.setLayoutY(layoutPuzzleButtonY + 60); button16.setLayoutY(layoutEmptyButtonY - 60); gameHistory.setText(gameHistory.getText() + down); } //押したボタンと空白のボタンが1つ離れている(下) else if (clickedBtn.getLayoutY() == button16.getLayoutY() - 120) { for (Button group1 : group) { double groupMoveX = group1.getLayoutX(); double groupMoveY = group1.getLayoutY(); if (layoutPuzzleButtonX == groupMoveX) { group1.setLayoutY(groupMoveY + 60); if (groupMoveY > layoutEmptyButtonY || groupMoveY == layoutEmptyButtonY - 180) { group1.setLayoutY(groupMoveY + 0); } } } button16.setLayoutY(layoutEmptyButtonY = layoutPuzzleButtonY); gameHistory.setText(gameHistory.getText() + down); } //押したボタンと空白のボタンが2つ離れている(下) else if (clickedBtn.getLayoutY() == button16.getLayoutY() - 180) { for (Button group1 : group) { double groupMoveX = group1.getLayoutX(); double groupMoveY = group1.getLayoutY(); if (layoutPuzzleButtonX == groupMoveX) { group1.setLayoutY(groupMoveY + 60); } } button16.setLayoutY(layoutEmptyButtonY = layoutPuzzleButtonY); gameHistory.setText(gameHistory.getText() + down); } //押したボタンと空白のボタンが隣接(上) else if (clickedBtn.getLayoutY() == button16.getLayoutY() + 60) { clickedBtn.setLayoutY(layoutPuzzleButtonY - 60); button16.setLayoutY(layoutEmptyButtonY + 60); gameHistory.setText(gameHistory.getText() + up); }

以下は上、右、左でほぼ同じコードなので省略します。

試したこと

ここに問題に対して試したことを記載してください。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

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

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

guest

回答1

0

履歴表示なのであれば、入力は必要ありませんよね。であれば、TextAreaではなくListViewのほうが適当だとおもいますけど。

提示されたソースはとても試しで動かせる状態ではありませんし、これを理解するところまで読み込む気も動くところまで書き直す気もないので、たとえば、ということで。

どうしてもTextAreaにこだわるのであれば、読み捨ててください。

java

1import javafx.application.Application; 2import javafx.event.ActionEvent; 3import javafx.event.EventHandler; 4import javafx.scene.Scene; 5import javafx.scene.control.Button; 6import javafx.scene.control.ListView; 7import javafx.scene.layout.HBox; 8import javafx.scene.layout.VBox; 9import javafx.stage.Stage; 10 11import java.util.ArrayList; 12import java.util.Arrays; 13import java.util.List; 14 15public class xxHoge { 16 public static void main(final String[] args) { 17 Application.launch(App.class, args); 18 } 19 20 public static class App extends Application { 21 private final int MAX_NUM_OF_LOG_LINES = 10; 22 23 @Override 24 public void start(final Stage primaryStage) throws Exception { 25 final VBox vBox = new VBox(); 26 27 // 28 final ListView<String> logs = new ListView<>(); 29 vBox.getChildren().add(logs); 30 31 // 32 final EventHandler<ActionEvent> handler = new EventHandler<ActionEvent>() { 33 private int count = 0; 34 35 @Override 36 public void handle(ActionEvent event) { 37 final Button butotn = (Button) event.getSource(); 38 final String text = String.format("%s手目: %sボタンが%s移動", ++count, 39 butotn.getText(), butotn.getText()); 40 final List<String> items = new ArrayList<>(logs.getItems()); 41 items.add(text); 42 final List<String> newItems = items.size() < MAX_NUM_OF_LOG_LINES ? items : items.subList(1, MAX_NUM_OF_LOG_LINES); 43 logs.getItems().setAll(newItems); 44 logs.scrollTo(items.size()); 45 } 46 }; 47 48 final HBox hBox = new HBox(); 49 vBox.getChildren().add(hBox); 50 51 for (String text : Arrays.asList("up", "down", "left", "right")) { 52 final Button button = new Button(text); 53 hBox.getChildren().add(button); 54 button.setOnAction(handler); 55 } 56 57 // 58 primaryStage.setScene(new Scene(vBox)); 59 primaryStage.setTitle(this.getClass().getName()); 60 primaryStage.show(); 61 } 62 } 63}

投稿2020/04/29 01:05

編集2020/04/29 01:06
shiketa

総合スコア3990

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問