質問: number.substring(number.length( ) - 3); // 行番号,1行文のデータと区切り textarea.append(linenumber + "|" + s + delimiter); } textarea.printAll(printGraphics); // 印刷する printGraphics.dispose( ); // 用紙を排出する printJob.end( ); // 印刷終了 textarea.setText(sentence); // 文章を元に戻す } ``` ### 試したこと 課題に対してアプローチしたことを記載してください ### 補足情報(言語/FW/ツール等のバージョンなど) より詳細な情報
回答: StringTokenizerは、文字列を指定された区切り文字(delimiter)で区切って分割していくクラスです。 例えば"1 2 3 4"という文字列を、区切り文字を" "(半角スペース)とすると、nextToken()によって"1","2","3","4"という文字列が順番に得られます。 今回の場合、区切り文字が改行文字"\n"と指定されているので、元の文字列を行ごとに区切ります。 そしてwhileに入り、最初のifではlinecountは0なので印刷する部分のifには入らず、テキストエリアを空にし、グラフィックコンテキストの取得処理が行われます。 その後元のテキストから1行取り出し、linecountを1増やします。増えた後のlinecountを、3桁の文字列に変えている処理が次の ``` String number = "000" + String.valueOf(linecount); // 行番号を3桁に編集 String linenumber = number.substring(number.length( ) - 3); ``` です。linecountが1なら、最初のnumberが"0001"となり、number.length()は4になります。number.substring()の引数は1になるため、左から2個目の0から右の部分が取り出され、"001"がlinenumberに入ります。 linecountが2桁になれば、例えば10なら、numberは"00010"となり、substring()の引数は2、左から3文字目以降が取り出され、"010"になります。要は必ず3文字になるよう切り詰めているのです。まあもっとも、この処理は ``` String linenumber = String.format("%1$03d", linecount); ``` で済むのですが... で、行番号を作った後は、この行番号とテキストから取り出した文字列とを組み合わせて、新たな文字列を作ります。元のテキスト1行目に"あいうえお"と書かれていたとしたら、 001|あいうえお という文字列が作成され、テキストエリアに追加されます。1行目の場合は直前にテキストエリアを空にしているので、この1行目の文字列だけが存在する状態になります。 で、この処理をStringTokenizerが文字列を返せる間繰り返すわけですが、50行ごとにwhileの最初のif文`linecount % 50 == 0`が成立します。この時は文字列を追加する前に印刷を行い、テキストエリアを空にして、また次の行から新たな紙に印刷できるようにしています。