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

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

新規登録して質問してみよう
ただいま回答率
85.49%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

JavaFX

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

Java

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Q&A

解決済

2回答

1295閲覧

【javaFX】自作テキストエディタのダイアログから.txtファイルを読み込んでも表示されない

javafuku

総合スコア1

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

JavaFX

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

Java

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

文字コード

文字コードとは、文字や記号をコンピュータ上で使用するために用いられるバイト表現を指します。

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

0グッド

0クリップ

投稿2020/10/24 14:04

編集2020/10/24 14:13

【javaFX】自作テキストエディタで.txtファイルを読み込みたい

初学者です。javaFXで読み書き機能のみの簡易なテキストエディタを作っています。実行環境はEclipseです。(Ver.は最下部に記載しています。)

###.txtファイルを読み込んでも、エディタに何も表示されない

FileInputStreamで読み込みの実装を試みています。

とりあえず下図のように実行は出来、GUIは立ち上がりまして、
![イメージ説明]

下図のようにファイルを開くダイアログも立ち上がるのですが、
イメージ説明

下図の左側のように、エディタに何も表示されません。
(※比較の為、右側はWindowsアクセサリのメモ帳で同ファイルを開いた様子。表示されています。)
イメージ説明

特にコンソールにはエラーメッセージもありません。
こんな初歩的な問題でお恥ずかしい限りですが、私なりに様々調べて改善を試みたのですが、
どうしても解決できず質問させていただきました。

どなたかご教授いただければ幸いです。

以下、ソースコード全文です。

java

1 package application; 2 3//把握したいインターフェースは、*を用しない事とする 4import java.io.File; 5import java.io.FileInputStream; 6import java.io.FileOutputStream; 7import java.io.IOException; 8import java.util.ArrayList; 9import javafx.application.*; 10import javafx.stage.*; 11import javafx.scene.*; 12import javafx.scene.control.Menu; 13import javafx.scene.control.MenuBar; 14import javafx.scene.control.MenuItem; 15import javafx.scene.control.TextArea; 16 17public class MainRoot extends Application { 18 19 @Override 20 public void start(Stage stage) { 21 22 stage.show(); 23 24 Group group1 = new Group(); //Group作成 25 Scene scene1 = new Scene(group1, 640, 480); //Scene作成 26 stage.setScene(scene1); //scene貼り付け 27 28 MenuBar menuBar1 = new MenuBar(); //メニューバー作成 29 menuBar1 .setPrefWidth(640); //幅設定 30 menuBar1 .setPrefHeight(30); //高さ設定 31 group1.getChildren().add(menuBar1); //groupのコントロールリストにメニューバーを追加 32 33 Menu menu1 = new Menu("ファイル"); //menuを作成 34 menuBar1.getMenus().add(menu1); //メニューバーにmenuを追加 35 36 MenuItem[] menuItem = new MenuItem[2]; //menuアイテムを作成 37 38 menuItem[0] = new MenuItem("開く"); //メニューアイテムを作成 39 menu1.getItems().add(menuItem[0]); //menuにメニューアイテム追加 40 41 menuItem[1] = new MenuItem("保存"); //menuアイテムを作成 42 menu1.getItems().add(menuItem[1]); //menuにメニューアイテム追加 43 44 TextArea textArea1 = new TextArea(); //TextArea作成 45 textArea1.setLayoutY(30); //Y座標を設定 46 textArea1.setPrefColumnCount(100); //列数を設定 47 textArea1.setPrefRowCount(100); //行数を設定 48 group1.getChildren().add(textArea1); //groupに追加 49 50 menuItem[0].setOnAction(e -> { //ファイル開く処理 51 try { 52 FileChooser fileChooser = new FileChooser(); //FileChooserインスタンス化 53 54 //拡張子フィルタ 55 fileChooser.getExtensionFilters().addAll( 56 new FileChooser.ExtensionFilter("txtファイル", "*.txt"), 57 new FileChooser.ExtensionFilter("全てのファイル", "*.*") 58 ); 59 60 File file = fileChooser.showOpenDialog(stage); //ダイアログ表示 61 FileInputStream fis = new FileInputStream(file); 62 63 //下行のput,putcの2つの変数の意図は、 64 int[] put = new int[128]; //後述のread関数の返り値がint型で、 65 char[] putc = new char[128]; //後述のString型のvalueOf関数の引数がchar配列型のため 66 ArrayList<String> list = new ArrayList<>(); //list変数にはString型に変換した文字列が(1行ずつ)保存されていく 67 68 for(int i = 0; i < 128; i++) { 69 put[i] = fis.read(); //1文字読み込む 70 putc[i] = (char)put[i]; 71 72 if(put[i] == '\n') { //改行になったら、 73 list.add(String.valueOf(putc)); //1行を追加 74 75 //初期化 76 for(int j = 0; i < 128; i++) { 77 put[j] = '\0'; //nullを代入 78 putc[j] = '\0'; //nullを代入 79 } 80 i = -1; 81 } 82 83 else if(put[i] == -1) { //読み込みエラー出たら(ファイルの終わりになったら) 84 put[i] = '\0'; //読み込みエラー (-1) をnullにする 85 list.add(String.valueOf(putc)); //1行を追加 86 break; 87 } 88 } 89 String text = ""; //「String」型の「text」変数に「list」変数内の全ての文字列を代入 90 for(int i = 0; i < list.size(); i++) { 91 text += list.get(i); //1行ずつ追加し、 92 } 93 textArea1.setText(text); //TextAreaに反映させる 94 95 fis.close(); //ファイルを閉じる ※ファイル破損リスクあり必ず! 96 } catch(IOException i) { //入出力例外の発生通知シグナルが投げられるので、catchで補捉 97 } 98 }); 99 menuItem[1].setOnAction(e -> { //setOnAction関数で保存ボタンの処理 100 try { 101 FileChooser fileChooser = new FileChooser(); //FileChooserインスタンス化 102 103 //拡張子フィルタ 104 fileChooser.getExtensionFilters().addAll( 105 new FileChooser.ExtensionFilter("txtファイル", "*.txt"), 106 new FileChooser.ExtensionFilter("全てのファイル", "*.*") 107 ); 108 109 File file = fileChooser.showSaveDialog(stage); // ダイアログ表示 110 FileOutputStream fos = new FileOutputStream(file); 111 String text = textArea1.getText(); // テキスト領域の文字列を取得 112 fos.write(text.getBytes()); // ファイルに保存 113 fos.close(); // ファイルを閉じる 114 }catch(IOException i) { 115 } 116 }); 117 118 } 119}

試したこと

文字コードの問題を疑いまして、
指定の文字コード(UTF-8)を渡したInputStreamReaderで
ファイルを開かせる様に記述してみましたが、
同じく表示されませんでした。

以下、その際のソースコードです。
※読み込み部分のみ

java

1 2/*上部省略*/ 3 4public void start(Stage stage) { 5 6 stage.show(); 7 String charset = "UTF_8"; //文字コード指定 8 9 /*途中省略*/ 10 11 menuItem[0].setOnAction(e -> { //ファイル開く処理 12 try { 13 FileChooser fileChooser = new FileChooser(); //FileChooserインスタンス化 14 15 //拡張子フィルタ 16 fileChooser.getExtensionFilters().addAll( 17 new FileChooser.ExtensionFilter("txtファイル", "*.txt"), 18 new FileChooser.ExtensionFilter("全てのファイル", "*.*") 19 ); 20 21 File file = fileChooser.showOpenDialog(stage); //ダイアログ表示 22 FileInputStream fis = new FileInputStream(file); 23 InputStreamReader is = new InputStreamReader(fis,charset); 24 BufferedReader reader = new BufferedReader(is); 25 26 while (reader.ready()) { 27 String text = ""; 28 text = reader.readLine(); 29 textArea1.setText(text); //TextAreaに反映させる 30 } 31 fis.close(); //ファイルを閉じる ※ファイル破損リスクあり必ず! 32 } catch(IOException i) { //入出力例外の発生通知シグナルが投げられるので、catchで補捉 33 } 34 }); 35 36/*以下省略*/ 37

実行環境

Eclipse IDE for Java Developers
Version: 2018-09 (4.9.0)
Build id: 20180917-1800
OS: Windows 10, v.10.0, x86 / win32
Java version: 1.8.0_261
e(fx)clipse version: 1.0.0.201408150..

以上です。情報が不足していましたら追記致します。宜しくお願い致します。

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

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

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

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

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

guest

回答2

0

なんで1文字ずつ読んでるんだろう??と思いましたが、
JavaFXでテキストエディタを作る方法
こちらを参考にされたんですね?(申し訳ないですがあまり良い出来には見えません^^;
参考サイトは必ず質問に記載してください。

今回の問題はここです。

Java

1} catch (IOException i) { 2}

例外をキャッチしても何もしなかったら、例外が起きているかもわからなくなってしまいます。

Java

1} catch (IOException i) { 2 i.printStackTrace(); 3}

少なくともこのよう表示するようにしておけば、何が悪かったのかはわかるでしょう。


Java

1while (reader.ready()) { 2 String text = ""; 3 text = reader.readLine(); 4 textArea1.setText(text); 5}

setTextは丸ごと入れ替えます。追記の意味ではappendTextがあります。

投稿2020/10/24 15:47

TN8001

総合スコア9304

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

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

javafuku

2020/10/25 09:12

ご回答ありがとうございます。 参考サイトの記載漏れ、失礼いたしました。 ズバリ当てられ驚きです...! 今後は参考にするサイトも吟味するリテラシーが必要だと学ばせて頂きました。 例外のキャッチからの、 i.printStackTrace(); 調べた所、基本中の基本だったのですね。。勉強不足でした。 これでひとまず例外が起きていることだけでもわかるようになりました。 また、setTextとappendTextの違いもご教授いただき、とてもためになりました。どうもありがとうございました。
guest

0

ベストアンサー

日本語を含まない、英数字だけのファイルを読み込むとちゃんと表示されます。
JavaFXの問題、というよりも、ファイルの読み込みの仕方の問題ではないでしょうか。

java

1 //下行のput,putcの2つの変数の意図は、 2 int[] put = new int[128]; //後述のread関数の返り値がint型で、 3 char[] putc = new char[128]; //後述のString型のvalueOf関数の引数がchar配列型のため

このあたりの意図が不明なのですが、一バイトずつ読み込んでいるような感じなので日本語を含むファイルを読み込んだときのtextの内容がむちゃくちゃになっているとおもいます。実行時にエラーが出てますよね。きっと。私の環境では発生しました。むちゃくちゃな内容を渡されて、それを描画しようとしたときにJavaFXの深いところで例外が発生しました。

text

1java.lang.ArrayIndexOutOfBoundsException: -31 2 at com.sun.prism.impl.GlyphCache.getCachedGlyph(GlyphCache.java:332) 3 at com.sun.prism.impl.GlyphCache.render(GlyphCache.java:147) 4 at com.sun.prism.impl.ps.BaseShaderGraphics.drawString(BaseShaderGraphics.java:2101) 5 at com.sun.javafx.sg.prism.NGText.renderText(NGText.java:312)

わたしなら、こうやって読み込みます。

java

1 menuItem[0].setOnAction(e -> { //ファイル開く処理 2 try { 3 FileChooser fileChooser = new FileChooser(); //FileChooserインスタンス化 4 5 //拡張子フィルタ 6 fileChooser.getExtensionFilters().addAll( 7 new FileChooser.ExtensionFilter("txtファイル", "*.txt"), 8 new FileChooser.ExtensionFilter("全てのファイル", "*.*") 9 ); 10 11 File file = fileChooser.showOpenDialog(stage); //ダイアログ表示 12 13 if (file != null) { 14 final String lines = Files.readAllLines(file.toPath()).stream().collect(Collectors.joining("\n")); 15 textArea1.setText(lines); 16 return; 17 } 18 19 } catch (Exception i) { //入出力例外の発生通知シグナルが投げられるので、catchで補捉 20 i.printStackTrace(); 21 } 22 });

文字コードを指定するなら、ファイルがどんな文字コードで作成されているのかを確認してみては。Windows環境ならMS932かも。

投稿2020/10/24 15:27

編集2020/10/24 15:33
shiketa

総合スコア3971

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

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

javafuku

2020/10/25 09:45 編集

具体的な読み込みソースの例を交えたご丁寧な回答、ありがとうございます!お陰様で、表示させることが出来ました!! ご指摘の通り、読み込みの仕方の問題でした。実行時のエラーも出ていたようでした。加えてわざわざ1バイト(1文字?)ずつ読み込む方法で、処理を過度に複雑にしていた様です。 しかもこれまで1行のみの表示だったのが、readAllLinesメソッドによって全行まで表示されました。ありがとうございます!(引数の部分のfile.toPath()).stream().collect(Collectors.joining("\n")という記述は、ひとつずつドキュメントとにらめっこしたのですが、正直まだきちんと理解出来なかったので、今後の宿題としたいと思います。 文字コードもアドバイス頂いた通り調べてみました。私の環境では、 ・自作テキストエディタでの日本語を含むファイルの作成では"ANSI" ・Eclipseのワークスペース全体は"UTF-8" ・Windowsのテキスト・エン・コードは”MS932” でした。 この際Windowsのテキスト・エン・コードを"UTF-8"に変更した所、 自作テキストエディタでの日本語を含むファイルの作成も”UTF-8”になり、結果的に英数字だけでなく日本語を含めたファイルの読み書きが相互にスムーズに出来る様になりました。 本当に助かりました。ありがとうございました。
shiketa

2020/10/25 12:06

Javadocとはにらめっこした、ということなので簡単に。 1. Files.readAllLines(file.toPath()) でfileの内容をList<String>にする。 1. stream()でStream<String>を生成して、 1. collect(Collectors.joining("\n"))で各要素を改行文字で連結する。
javafuku

2020/10/27 04:56

そういう事なのですね!!かみ砕いてご説明頂いたお陰で、 それぞれの記述の役割を認識することが出来ました。 最後まで面倒見て頂き、ありがとうございます!!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問