【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..
以上です。情報が不足していましたら追記致します。宜しくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/10/25 09:12