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

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

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

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

Q&A

解決済

2回答

1625閲覧

どのように処理が流れているかを解説して頂けませんか?

gyro16

総合スコア89

Java

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

0グッド

0クリップ

投稿2017/02/03 00:23

###前提・実現したいこと
ここに質問したいことを詳細に書いてください

サンプルプログラムの抜粋です。
印刷機能部分です。
書籍では解説が端折られているため、理解するのに困っています。

StringTokenizer の使い方やwhile 文前後が何をやっているか分かりません。
何をどうやって印刷しているか、理解できません。
linecount の使われ方や条件文などの使われ方を日本語で解説して欲しいです。
linecount が 0や 50だった場合や他の場合、どうやって処理しているかを、
流れを日本語で解説して欲しいです。

どのように処理が流れているかを解説して頂けませんか?

###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード

java

1 } 2 else if (label.equals("Print")) { 3 // PrintJobのオブジェクト作成 4 PrintJob printJob = 5 getToolkit( ).getPrintJob(this, "Printing Text", null); 6 if (printJob == null) 7 return; 8 Graphics printGraphics = null; 9 setSize(width, height); // フレームサイズ設定 10 textarea.setSize(width, height); // 印刷サイズ設定 11 // テキストエリヤのテキスト取得 12 String sentence = textarea.getText( ); 13 String delimiter = "\n"; // 区切り文字取得 14 StringTokenizer st = new StringTokenizer(sentence, delimiter); 15 int linecount = 0; // 行カウント0クリア 16 while (st.hasMoreTokens( )) { 17 if (linecount % 50 == 0) { 18 if (linecount > 0) { 19 textarea.printAll(printGraphics); // 印刷する 20 printGraphics.dispose( ); // 用紙を排出する 21 } 22 textarea.setText(""); // テキストエリヤクリア 23 // PrintJobのグラフィックコンテキスト取得 24 printGraphics = printJob.getGraphics( ); 25 } 26 String s = st.nextToken( ); // 1行取り出し 27 linecount++; // 行をカウントアップ 28 String number = "000" + String.valueOf(linecount); 29 // 行番号を3桁に編集 30 String linenumber = number.substring(number.length( ) - 3); 31 // 行番号,1行文のデータと区切り 32 textarea.append(linenumber + "|" + s + delimiter); 33 } 34 textarea.printAll(printGraphics); // 印刷する 35 printGraphics.dispose( ); // 用紙を排出する 36 printJob.end( ); // 印刷終了 37 textarea.setText(sentence); // 文章を元に戻す 38 }

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

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

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

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

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

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

guest

回答2

0

ベストアンサー

StringTokenizerは、文字列を指定された区切り文字(delimiter)で区切って分割していくクラスです。
例えば"1 2 3 4"という文字列を、区切り文字を" "(半角スペース)とすると、nextToken()によって"1","2","3","4"という文字列が順番に得られます。
今回の場合、区切り文字が改行文字"\n"と指定されているので、元の文字列を行ごとに区切ります。

そしてwhileに入り、最初のifではlinecountは0なので印刷する部分のifには入らず、テキストエリアを空にし、グラフィックコンテキストの取得処理が行われます。
その後元のテキストから1行取り出し、linecountを1増やします。増えた後のlinecountを、3桁の文字列に変えている処理が次の

java

1 String number = "000" + String.valueOf(linecount); 2 // 行番号を3桁に編集 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文字になるよう切り詰めているのです。まあもっとも、この処理は

java

1String linenumber = String.format("%1$03d", linecount);

で済むのですが…
で、行番号を作った後は、この行番号とテキストから取り出した文字列とを組み合わせて、新たな文字列を作ります。元のテキスト1行目に"あいうえお"と書かれていたとしたら、
001|あいうえお
という文字列が作成され、テキストエリアに追加されます。1行目の場合は直前にテキストエリアを空にしているので、この1行目の文字列だけが存在する状態になります。
で、この処理をStringTokenizerが文字列を返せる間繰り返すわけですが、50行ごとにwhileの最初のif文linecount % 50 == 0が成立します。この時は文字列を追加する前に印刷を行い、テキストエリアを空にして、また次の行から新たな紙に印刷できるようにしています。

投稿2017/02/03 00:55

swordone

総合スコア20651

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

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

gyro16

2017/02/03 01:46

わかりやすい解説を有難うございました。流れが分かりました。
guest

0

#StringTokenizer の使い方

これは、指定された文字列を、指定された区切り文字で配列のような状態にしてくれるクラスです。

ドキュメント
http://docs.oracle.com/javase/jp/7/api/java/util/StringTokenizer.html

内部のデータを使用する際には、while のなかで、nextToken( )を呼び出します。

#whileの文前後
このwhile文は、StringTokenizerに格納された要素の数だけ、繰り返し処理を行います。
(この場合は、\nが登場する回数分になります。)

#linecountの条件
linecountはプリントの条件に使用されているようです。

linecount % 50 == 0
はlinecountを50で割った余りが0であるか(linecountが50の倍数か)

linecount > 0
はlinecountが0以上であるか(0を50で割った場合も0になるので)

そして、linecountは文字列ごとに加算されているので、
50行編集を行ったら、プリントし印刷するために使われています。
0以上の条件が無い場合は、最初になにも記述されていない用紙が排出されてしまいます。

投稿2017/02/03 00:42

satouryou

総合スコア70

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

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

gyro16

2017/02/03 01:33

ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問