javaでテキストの改行表示について困っています

このQ&Aのポイント
  • javaを用いて、プログラムを作成中です。
  • テキストの改行表示方法について困っています。
  • 具体的なソースコードも載せて質問しています。
回答を見る
  • ベストアンサー

読み込んだテキストの改行表示

javaを用いて、プログラミングしているのですが 読み込んだテキストの改行表示の仕方で困っています。 プログラムは、日本語か英語で単語を入力(例:一、one)すると 読み込むwords.txtから対応するスペイン語(例:一 * one * UNO ⇒UNO)を textareaに表示するというものです。 このとき、読み込んだwords.txtは現在は 一 * one * UNO 二 * two * DOS … となっているのですが、このスペイン語の部分に日本語の注釈をつけ 数行に渡ってtextareaに表示したいと思っています。 説明が拙く少し分かりづらいですが、画像などを参照してくださると助かります。 具体的には、今はスペイン語のtextareaに  UNO とだけ表示されているものを  UNO  [数]一つの といったように表示するにはどうすれば良いでしょう? 一応、該当部分のソースコードも載せておきます。 質問の仕方も悪いですが、どうかよろしくお願いします。 public void actionPerformed(ActionEvent e){ try{ if(e.getSource() == Honyaku){ BufferedReader wordsfile = new BufferedReader(new FileReader("Z:/09sotsuron/words.txt")); while ((wrs=wordsfile.readLine())!= null){ StringTokenizer st = new StringTokenizer(wrs," * "); nichi ="" + st.nextToken(); ei ="" + st.nextToken(); supe = "" + st.nextToken(); if ((jap.getText()).equals(nichi)){ eng.setText(ei); spa.setText(supe); } else if ((eng.getText()).equals(ei)){ jap.setText(nichi); spa.setText(supe); } } wordsfile.close(); } else if(e.getSource() == Clear){ nichi = ""; ei =""; supe = ""; jap.setText(nichi); eng.setText(ei); spa.setText(supe); } } catch(IOException ie){ System.exit(1); } }

  • Java
  • 回答数4
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
回答No.4

あいや、setTextメソッドが innerHTMLを使っているのか、innerTextを使っているのかが知りたかったのです。 (両方使ってないかもしれない) 方向が変わってしまって申し訳ないのですが、 辞書内の文字列が "文字列" + "\r\n" + "文字列" だとjava内でエスケープ文字が解決されてしまうので "文字列" + "\\r\\n" + "文字列" とし、"\"自体をエスケープしないとHTMLで"\"が書けないような気がしますね。

RaiDeen
質問者

補足

"文字列1" + "\\r\\n" + "文字列2" で実行すると "文字列1" 、 文字列1 + "\\r\\n" + 文字列2 で実行すると 文字列1 と表示されました。 解決できませんでしたが、とりあえず保留して他の部分に移ろうと思います。 色々有難うございました。

その他の回答 (3)

回答No.3

#1,2です。 全容がわからないのでなんともいえませんが >>eng.setText(ei); >>spa.setText(supe); このsetText()メソッドは自作のものですか? 実際にHTMLに文字列を描画するときに"innerHTML"を使用していませんか? innerHTMLでは、エスケープ文字や数字、実態参照文字を入力しても、 そのまままの"文字列"、または半角空白?が描画されるようです 解決後の文字を描画したいときはinnerTextを使用してください。 innerTextに "あああ\r\nいいい"と突っ込んだらうまくいきました。

RaiDeen
質問者

補足

あまり長たらしくなってもいけないと思い該当部分のみコードを記載しましたが、全容は以下の通りです。 import java.applet.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.swing.*; public class reference extends Applet implements ActionListener{ Button Honyaku, Clear; TextField jap, eng; TextArea spa; String wrs; String nichi, ei, supe; public void init(){ setBackground(new Color(200, 200, 200)); add(new Label("[ japanese ]")); jap = new TextField("", 30); add(jap); add(new Label("[ english ]")); eng = new TextField("", 30); add(eng); Honyaku = new Button("スペイン語に翻訳"); Honyaku.addActionListener(this); add(Honyaku); Clear = new Button("ウィンドウ内を消去"); Clear.addActionListener(this); add(Clear); add(new Label("[ spanish ]")); spa = new TextArea("", 5, 30); add(spa); } public void actionPerformed(ActionEvent e){ try{ if(e.getSource() == Honyaku){ BufferedReader wordsfile = new BufferedReader(new FileReader("Z:/09sotsuron/words.txt")); while ((wrs=wordsfile.readLine())!= null){ StringTokenizer st = new StringTokenizer(wrs," * "); nichi ="" + st.nextToken(); ei ="" + st.nextToken(); supe = "" + st.nextToken(); if ((jap.getText()).equals(nichi)){ eng.setText(ei); spa.setText(supe); } else if ((eng.getText()).equals(ei)){ jap.setText(nichi); spa.setText(supe); } } wordsfile.close(); } else if(e.getSource() == Clear){ nichi = ""; ei =""; supe = ""; jap.setText(nichi); eng.setText(ei); spa.setText(supe); } } catch(IOException ie){ System.exit(1); } } } で、単語ファイルのほうが 一 * one * uno 二 * two * dos … となっています。 で、コンパイルしてできたreference.classをHTML中で  <applet code="reference.class" width="280" height="350"></applet> で読み込んで実行しています。

回答No.2

>> 一 * one * UNO\r\n[数]一つの >> 二 * two * DOS\r\n[数]二つの 注釈も同辞書内にあるのですね >>注釈とする別のtxt辞書を作ればよいのでしょうか?アノテーション>>というのは使ったことがなくよくわかりませんが… getAnnotationというのは適当に書いただけです、すみません。 私もよくわかりません。 文字列に対応する文字列を引っ張ってくる、というメソッドがあるなら それを利用して指定したスペイン語文字列から対応する注釈文字列 をもってくるのかな? と思っただけです。そうすれば、スペイン語と注釈文字列もばらばらに使えてなんとなく気持ちがいいですし。 >>ちなみにプログラムはHTMLに表示しています。  HTMLに表示しているのならば\nを連結するだけでいいんじゃないかなぁ と思いましたが、 javascriptを使用して、<textarea></textare>のinnerHTMLに "文字列" + "\n" + "文字列" を突っ込んだところ、FireFox、Google chromeでは正常に改行されましたが、 IE7では改行されませんでした うーん。 IEのバージョンはなんでしょうか?

RaiDeen
質問者

補足

innerHTMLというのも少し調べてみます。 IEのバージョンは7です。

回答No.1

ちょっとよくわからないんですが 英語とスペイン語が対応しているtxt辞書から引っ張り出して 該当するスペイン語を表示させているのですよね? 注釈となる文字列を引き出すのに、スペイン語と注釈とが対応しているtxt辞書があるのかどうかわかりませんが String antatSpa = ""; antatSpa = spa.getAnnotation(supe); supe = supe + "\n" + antatSpa; spa.setText(supe); とかでできるんじゃないでしょうか。 これはHTMLに表示しているのですか? HTMLに表示する文字列を生成するのならば supe = supe + "<br />" + antatSpa; でどうでしょう。

RaiDeen
質問者

補足

ちょっと説明が悪かったです、すみません 現状は、txtファイルは  一 * one * UNO  二 * two * DOS となってまして、これを  一 * one * UNO\r\n[数]一つの  二 * two * DOS\r\n[数]二つの といったように同じtxt辞書内にある注釈を改行して表示できないか、という質問です。上記の\r\nではできませんでした 注釈とする別のtxt辞書を作ればよいのでしょうか?アノテーションというのは使ったことがなくよくわかりませんが… ちなみにプログラムはHTMLに表示しています。 

関連するQ&A

  • 読み込んだ行からランダムに選ぶ

    外部テキストからBufferedReaderで読み込んだ行をStringTokenizerで * の前と後ろに分けて、 nichi ="" + st.nextToken(); ei ="" + st.nextToken(); というように取得しています。 これをsetTextメソッドで文字列として表示しているのですが、順に読み込んだ中からランダムに選ぶ場合はどうすれば良いでしょうか import java.applet.*; import java.awt.*; import java.awt.event.*; import java.io.*; import java.util.*; import javax.swing.*; public class examination extends Applet implements ActionListener{ Button Check, Next; TextField jap, eng, seigo; String wrs; String nichi, ei; public void init(){ setBackground(new Color(200, 200, 200)); add(new Label("[ japanese ]")); jap = new TextField("", 30); add(jap); add(new Label("[ english ]")); eng = new TextField("", 30); add(eng); Check = new Button("正誤判定"); Check.addActionListener(this); add(Check); seigo = new TextField("", 3); add(seigo); Next = new Button("次の問題へ進む"); Next.addActionListener(this); add(Next); } public void actionPerformed(ActionEvent e){ try{ if(e.getSource() == Next){ BufferedReader wordsfile = new BufferedReader(new FileReader("D:/list.txt")); while ((wrs=wordsfile.readLine())!= null){ StringTokenizer st = new StringTokenizer(wrs," * "); nichi ="" + st.nextToken(); ei ="" + st.nextToken(); jap.setText(nichi); ← } wordsfile.close(); }(以下省略) ←の部分ですが、このままだと最後に読み込んだ行のnichiが表示されますよね? これを読み込んだ中からランダムに一行選んで表示するにはどうすれば良いでしょうか。

    • ベストアンサー
    • Java
  • javaのStringデーターの読込みについて

    javaのStringTokenizerを使用しました、ストリングデーターの読み取りに ついて質問します。 入力ファイルの200.0から800.0の7個のデーターは読取ることが出来ます。 次の行の200.0を読込みますと、『str=st.nextToken(); 』でエラーになります。 Q1)このエラーの原因について、コメント頂けますと大変助かります。 //入力ファイル 200.0 300.0 400.0 500.0 600.0 700.0 800.0 200.0 2000.0 4000.0 110 //ファイルの読取コード void fileIn_f_snd_chk_etc(){ String strX; String str; try{ File file = new File("c:\\TRSX700\\file_snd_chk_etc.txt"); if (myMsrCtlPanel.checkBeforeReadfile(file)){ BufferedReader bread = new BufferedReader(new FileReader(file)); int j=0; while((strX = bread.readLine()) != null){ //<----String[] values = str.split(" * ",0); StringTokenizer st=new StringTokenizer(strX," * "); //====================== for(int i=0; i<7; i++){ //ブランクは読み飛ばしている str=st.nextToken(); f_snd_chk[i].setText(str); //fileIn_f_snd_chk_etc() // System.out.print(f_snd_chk[i].getText()+" "); } // System.out.println(""); //ここまでは、正常読取 //====================== str=st.nextToken(); //ここでエラーになる f_imp_chk.setText(str); //fileIn_f_snd_chk_etc() // System.out.print(f_imp_chk+" "); //====================== str=st.nextToken(); f_dst_chk.setText(str); //fileIn_f_snd_chk_etc() // System.out.print(f_dst_chk+" "); //====================== str=st.nextToken(); f_fft_chk.setText(str); //fileIn_f_snd_chk_etc() // System.out.print(f_fft_chk+" "); //====================== str=st.nextToken(); key_data.setText(str); //fileIn_f_snd_chk_etc() System.out.print("f_imp_chk="+f_imp_chk.getText()+" f_dst_chk="+f_dst_chk.getText()+" f_fft_chk="+f_fft_chk.getText()+" key_data="+key_data.getText()); } //while bread.close(); } //if else{ System.out.println("ファイルが見つからないか開けません"); } } //try catch(FileNotFoundException e){ System.out.println("FileNotFoundException: "+e); } catch(IOException e){ System.out.println("IOException: "+e); } System.out.println("file_inの終了"); } //fileIn_f_snd_chk_etc() //以上

  • 静的変数と静的メソッドの使い方について

    独習JAVAにてJAVAを学習しています。「コマンドライン引数を受け取り、それをスペイン語表記に変換して表示するアプリケーションを作成しなさい。例えば、OneはUno、・・・、FiveはCincoになります。静的メソッドを使って実現しなさい」という問題で躓きました。以下、私が作成したプログラムです。 class Language { static String st[] = new String[5]; //静的初期化ブロックは実行しない。 //コマンドライン引数を受け取るmainメソッドが使えないため //静的メソッド static String translation(){ for(int i = 0; i < st.length; i++) { if(st[i] == "One") return st[i] = "Uno"; if(st[i] == "Two") return st[i] = "Dos"; if(st[i] == "Three") return st[i] = "Tres"; if(st[i] == "Four") return st[i] = "Quatro"; if(st[i] == "Five") return st[i] = "Cinco"; } } //21行目 } class StaticalMethodPractice { public static void main(String args[]) { //mainメソッドが登場したので、静的変数を初期化する for(int i = 0; i < Language.st.length; i++) Language.st[i] = args[i]; //静的メソッドを実行 System.out.println(Language.translation()); } } このプログラムに対して、21行目return文が指定されていませんというエラーメッセージが出てくるのですが、そもそもreturnの使い方もよく分からないので右往左往している状況です。低級な質問かもしれませんが、よかったらアドバイスの方よろしくお願いします。

  • ダイナミックテキストに読み込んだテキストを改行させるにはどうすればよいのでしょうか?

    Windows XP SP2 FLASH MX 2004を使用しております。 ダイナミックテキストのインスタンス名をmessage_txtとして this.message_txt.text = "数字を入力してからボタンを押す。"; とスクリプトを書くと横幅が足らない場合、勝手に改行されます。 自分で任意で改行させて下記のように表示させるにはどうすればよいのでしょうか? <このように表示させたい> 数字を入力してから ボタンを押す。 <現状> 数字を入力してからボタ ンを押す。

    • ベストアンサー
    • Flash
  • テキストエリアの改行表示

    現在CGIの勉強を行っているのですが、 以下の点がうまくいかなくて困っています。 -----------HTML(例)------------------ 投稿名 :[ SAMPLE ] TITLE :[ SAMPLE1 ] TEXTAREA :[ aaaaaaaa _____________bbbbbbb] [投稿][リセット] -----------サブフレーム(bbs.cgi)----- 投稿名:[ SAMPLE ] TITLE :[ SAMPLE1 ] TEXTAREA :[ aaaaaaaa _____________bbbbbbb] ------------------------------------- 1.HTMLの方で投稿(サブフレーム形式) 2.BBS.CGIで処理を行う 3.TEXTAREAで改行を行って投稿した際の処理 (ここで投稿した際に別投稿として掲載されてしまいます。) *ソース #!/usr/local/bin/perl use CGI; #外部データの取得 $q = new CGI; #外部データの受取処理 $Name1 = $q->param('name'); $Name2 = $q->param('title'); $Name3 = $q->param('url'); $Name4 = $q->param('txt'); @FILE_FOR; $count=0; print "Content-type: text/html; charset=Shift_JIS \n\n"; #書き込み if($Name1 ne "" && $Name2 ne "" && $Name3 ne "" && $Name4 ne ""){ open(FH,">>log.dat"); print FH "$Name1,$Name2,$Name3,$Name4\n"; close(FH); } #読み込み if(!open(FH,"log.dat")){ print "読み込みに失敗しました。\n"; }else{ $F=0; foreach my $line (<FH>){ @FILE_FOR[$F] = $line; $F++; } } close(FH); #結果表示 if($F ne 0){ for($Y=$F;$Y > 0;$Y--){ $C = $Y; @BOX = split(/,/ ,$FILE_FOR[$Y - 1]); print "<CENTER>"; print "<HR><TABLE BORDER=2><TR><TD>No.$C</TD></TR>"; print "<TR><TD>投稿者:</TD><TD>@BOX[0]</TD></TR>"; print "<TR><TD>投稿タイトル:</TD><TD>@BOX[1]</TD></TR>"; print "<TR><TD>URL:</TD><TD><a href=@BOX[2]>@BOX[2]</a></TD></TR>"; print "<TR><TD>内容:</TD><TD><B>@BOX[3]</B></TD></TR></TABLE><HR>"; print "</CENTER>"; } }else{ print "現在は未投稿です。"; }

    • ベストアンサー
    • CGI
  • onmouseで表示させたテキストを改行したい。

    いつもお世話になっております。 下記過去ログのソースを参考にしました。 「オンマウスで別の場所に画像とテキストを表示したい」 http://okwave.jp/qa1688069.html このソース(下記に抜粋)で動かす際、'変更する文章'を、たとえば5行表示したい場合、改行時に<br />を入れると、そのままタグが表示されて、改行されません。 ためしに\nやら\rなど改行コードを何個か試してみましたが、思うような結果は得られませんでした。 いくつかの文章を改行して表示させたい場合は、どのように書けばよいでしょうか。 よろしくお願いします。 上記リンク先の回答#4さんのソースの抜き出しここから----- <script type="text/javascript"> <!-- function textChange(id,text){ var span_el = document.getElementById(id); var originalText = span_el.firstChild.nodeValue; span_el.firstChild.nodeValue=text; return originalText; } //--> </script> </head> <body> <span onMouseOver="RestoreText=textChange('text1','変更する文章')" onmouseout="textChange('text1',RestoreText)">文章変更</span> <span id="text1">このへんに文章</span> 抜き出しここまで--(brは省略しました) やりたいこと-------------------- <span onMouseOver="RestoreText=textChange('text1','変更する文章1行目<br />変更する文章2行目<br />変更する文章3行目<br />変更する文章4行目<br />変更する文章5行目<br />')" onmouseout="textChange('text1',RestoreText)">文章変更</span> <span id="text1">このへんに文章(改行されて表示)</span>

  • テキストの「改行」を置き換え

    ワード、ワードパッド、メモ帳、(VISTA Office 2007)の環境で テキストで改行をカンマ1つに置き換えたいのですが、お願いします。 他の文字の置き換えやワードなら改行の削除はできます。 ただ、 ワードで複数行の改行を^13で全部置き換えたら、カンマが複数になってしまいます。複数行の改行が沢山あってもカンマを1つにしたいのです。 ********************************** あいうえお かきくけこ ↓↓↓ あいうえお,,かきくけこ (カンマが複数になってしまいます) ↓↓↓ あいうえお,かきくけこ (カンマを1つにしたい)

  • java通信について

    アプレットビューアは 通信成功できますが HTMLから実行すると失敗します so = new Socket( "localhost", 80 ); この部分が失敗してるようです なぜ起こるんでしょうか ? 解決方法を教えてください。 //html <html><body> <applet code = "a.class" width = "370" height ="530"></applet> </body></html>   //<applet code = "a.class" width="400" height = "200"></applet> import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; public class a extends java.applet.Applet implements ActionListener{ TextField tf; Button b; TextArea t; Panel p, p1; String str = "http://localhost/cgi-bin/a.cgi"; public void init(){ tf = new TextField( 32 ); b = new Button( "Post" ); t = new TextArea( 20, 48 ); b.addActionListener( this ); p = new Panel(); p.add( new Label( "String" ) ); p.add( tf ); p.add( b ); p1 = new Panel(); p1.add( t ); add( p ); add( p1 ); } public void actionPerformed( ActionEvent e ){ String str; if( e.getSource() == b ){ t.setText( sen( tf.getText() ) ); } } private String sen( String a ){   Socket so = null; InputStreamReader in = null; OutputStream os = null; String str1 = new String(); try { t.setText( "aa" ); so = new Socket( "localhost", 80 ); t.setText( "bb" ); in = new InputStreamReader( so.getInputStream() ); os = so.getOutputStream(); }catch( Exception e ){ return "Error!"; } String H = "POST " + str + " HTTP/1.0\n"; H += "Content-Length:" + String.valueOf( a.length() ) + "\n\n"; String st = new String( H + a ); try{ os.write( st.getBytes() ); }catch( Exception e ){ return "Error!"; } str1 = "Send:\n" + st; boolean bo = true; StringBuffer sb = new StringBuffer(); int s; while( bo ){ try{ s = in.read();   if( s == -1 ) bo = false; else sb.append( (char)s ); }catch( Exception e ){ bo = false; } } str1 += "\nResv:\n" + sb.toString(); return str1; } }

    • ベストアンサー
    • Java
  • セル内で改行したテキストも含めて全体を表示させたい

    タイトルとおりの内容になりますが、普通にテキストを挿入していけば問題なく、「折り返して全体が表示」されるのですが、セル内で改行してしまうとどうしても全体が表示されません。 これを表示させる方法はありますでしょうか?

  • 入力テキスト内で改行コードが表示されてしまいます。

    現在phpで掲示板を作成しております。 返信画面でデータベースに保存している過去データを 返信用のテキストボックスで表示しているのですが、 例) ・コード <TEXTAREA NAME=body COLS=50 ROWS=8 wrap="soft"><? print $body ?></TEXTAREA> ・ブラウザ上 掲示板です<BR>テスト という風に表示されてしまいます。 改行が実行されないのはなぜでしょうか?

    • 締切済み
    • PHP

専門家に質問してみよう