ボンジュール・マドモアゼル

本サイトの情報は自己責任にてご利用下さい。

[正誤表] Java GUIプログラミング Java SE6対応 Vol.I 初版第3刷 正誤表

 
以下、「Java GUIプログラミング Java SE6対応 Vol.I 初版第3刷」にて見つかった誤記です。

全般
本書の全てのサンプルコードが GUI の起動を main スレッドで行っているが、
これは、スレッド安全上危険なやり方である。
正しくは、以下のように invokeLater() メソッドによって起動する。
    public static void main(String[] args) {

SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowFrame();
}
});
}
private static void createAndShowFrame() {
JFrame frame = new JFrame("JFrame02");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(400, 300);
frame.setVisible(true);
}
Swingの起動方法については以下の記事が参考になる。特に Java Tutorials の次の記述に注意。
Why does not the initial thread simply create the GUI itself? Because almost all code that creates or interacts with Swing components must run on the event dispatch thread.
なぜ、最初のスレッドが単純にGUI自体を作成しないのか、それは、Swingコンポーネントを作成するか、相互作用するほぼすべてのコードは、イベントディスパッチスレッド上で実行する必要があるためです。


Q4.3 SwingのGUIを起動する正しいやり方は?
http://homepage1.nifty.com/algafield/JavaGUIFaq19j.html#four3

The Java Tutorials — Creating a GUI With JFC/Swing > Concurrency in Swing > Initial Threads > Initial Threads
http://docs.oracle.com/javase/tutorial/uiswing/concurrency/initial.html

Java Tutorials Code Sample — HelloWorldSwing.java
http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/start/HelloWorldSwingProject/src/start/HelloWorldSwing.java

p.2
したがって、サンプルプログラムJFrame01.javaのクラスは、JFrameを継承していることになる。
→サンプルプログラムの JFrame01 クラスは何も継承していない。

p.16
シャットダウンフックは、後から登録したものから先に呼び出される。
→ シャットダウンフックの呼び出し順序は規定されていない。登録したものは何らかの順序で並行して実行される。
Runtime クラスの addShutdownHook メソッドについて Javadoc には次のように書かれている。

When the virtual machine begins its shutdown sequence it will start all
registered shutdown hooks in some unspecified order and let them run concurrently.
仮想マシンがシャットダウンシーケンスを開始すると、すべての登録済みシャットダウンフックを、
指定されていない順序で起動し並行して実行します。

p.18

■シャットダウンフックを指定したときには、このような順序で呼び出される
→ 呼び出し順序は規定されていない。さらに登録したものは並行して実行されるため、
呼び出し順序と出力結果の順序は必ずしも一致しない。

p.28
contentPane.setToolTipText("ContentPane は Swing コンポーネントです");
→ サンプルコードとして書式スタイルが設定されていない、行の下に水平線がない。

p.34
レイアウトマネージャーに関しては、別巻で詳しく取り上げる。
→ 具体的にどの巻か? vol. の目次にはそれらしいのが見当たらない。

p.54
誤:label1の東側とlabel1の西側が向き合うので、Label1の右側にLabel2が位置することになる。
正:label1の東側とlabel2の西側が向き合うので、Label1の右側にLabel2が位置することになる。
※label1の西側 → label2の西側

p.66
ImageLabel02.java
    public int getIconWidth() {

return this.width;
}
public int getIconHeight() {
return this.height;
}
→ 動作はするが、width, height は静的変数なので
this.width を width または DrawIcon.width にするか、
もしくは、width をインスタンス変数にするべき。
height についても同様。

p.67
誤:この例では、アイコンは幅・高さともに32ピクセルで、赤く塗りつぶした円が描画される。
正:この例では、アイコンは幅・高さともに100ピクセルで、緑色で塗りつぶした円が描画される。
※ 32ピクセル→100ピクセル、赤く→緑色

p.90
MenuTest05.java
    //System.out.println( e );
→ 下から7行目の行が余計。
//System.out.println( e ); //イベント内容を出力する
などのコメントを付加するか、この行を削除した方が良い。

p.96
ImageButton02.java
    public TestIcon() {

誤) color = Color.red;
正) color = Color.white;
}
p.96
ImageButton02.java
    public int getIconWidth() {

return this.width;
}
public int getIconHeight() {
return this.height;
}
→ 動作はするが、width, height は静的変数なので
this.width を width または DrawIcon.width にするか、
もしくは、width をインスタンス変数にするべき。
height についても同様。

p.127
誤:<br>タグは単なる改行にだけでなく、パラグラフ指定の意味もある。
正:<p>タグは単なる改行だけでなく、パラグラフ指定の意味もある。
※<br> → <p>,
改行にだけでなく → 改行だけでなく

p.131
Html10.java
frame.setDefaultCloseOperation(3); // EXIT_ON_CLOSE
次のように修正するべき。
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
以下のページについても同様。
p.133 Html10A.java
p.137 Html11.java
p.141 Html12.java
p.144 Html13.java
p.146 Html14.java
p.149 Html15.java
p.153 Html16.java
p.156 Html16A.java
p.160 Html17.java
p.162 Html18.java

p.154
■JTabbedPane でHTML指定
→ 掲載された図には JLabelオブジェクト month が表示されていない。
アプリケーション起動後、いずれかのタブを選択し、
month を表示させてから、ハードコピーを取ると以下のようになる。
Html16 表示結果差し替え版

p.158
■タブが表示される位置を変えられる
→ 掲載された図には JLabelオブジェクト month が表示されていない。
アプリケーション起動後、いずれかのタブを選択し、
month を表示させてから、ハードコピーを取ると以下のようになる。
Html16A 表示結果差し替え版

p.177
誤:ラジオボタンは、Contentpaneに追加するだけでなく、ButtonGroupにも追加する。
正:ラジオボタンは、ContentPaneに追加するだけでなく、ButtonGroupにも追加する。
※ Contentpane → ContentPane

p.216
    if (label == 'C') {

field.setText("");
(追加) arg = "";
opeCode = '+';
arg1 = 0;
lastTimeNum = false;
System.out.println("arg1:" + arg1);
return;
}
※ 元のコードには以下のようなバグがある。
【バグ内容】電卓の C ボタンを押した際、バッファ arg をクリアしていないため、
C ボタンでテキストフィールド上の数字をクリアしても、
再び数字を打ち始めると、それまで打った内容が復活してしまう。

p.282
誤:メッセージボックスはshowMessage Dialog()メソッドを使って生成する。
正:メッセージボックスはshowMessageDialog()メソッドを使って生成する。
※ showMessage Dialog() → showMessageDialog()

p.283
→ この章のほかの図とは違い「■最も単純なメッセージボックス」のハードコピーだけ、
メッセージボックスのみが含まれ、メインウィンドウが含まれていない。

p.284
第1引数の説明の4行目の「代引き数」は、「第1引数」の誤記であると思われる。

p.308
[取消し] ボタンが押された場合には、nullが返される。
→ この文は、「6-7 JOptionPaneの中にコンポーネントを置く」の1行目の文となっているが、
「6-6 コンボボックスを持つダイアログボックス〜」の最後の1文であるべき。

p.309
DialogTest07.java の実行結果が「■JOptionPaneには、さまざまなコンポーネントを置ける」の図と一致しない。
図を修正するか、DialogTest07.java を以下のように修正する必要がある。
サンプルコードを以下のように修正する場合には、p.310 のコード解説にあるコードも修正が必要となる。
        public void actionPerformed(ActionEvent e) {


String[] choice = { "One", "Two", "Three" };
JList li = new JList(choice);

(追加) JRadioButton rb = new JRadioButton("ラジオボタン", true);
(追加) JCheckBox cb = new JCheckBox("チェックボックス", true);

(修正) Object[] option = {li, rb, cb};
int ans = JOptionPane.showConfirmDialog(pane, option,
"JOptionの中でJListが使える",
JOptionPane.OK_CANCEL_OPTION);
System.out.println(li.getSelectedValue());
(追加) System.out.println(rb.isSelected());
(追加) System.out.println(cb.isSelected());
}
p.319
誤:String[] extensions = { "gif", "jpg" };
正:String[] extensions = { ".gif", ".jpg" };

※ 訂正後のコードは、gif, jpg の前にドットを付加。
元のコードでは、「jjjjpg」のようなファイル名で
拡張子のないファイルも表示されてしまう。

p.321
誤:String[] extensions = { "gif", "jpg" };
正:String[] extensions = { ".gif", ".jpg" };
※ 訂正後のコードは、gif, jpg の前にドットを付加。

p.324-p.325
JListTest01.java の実行結果が「■JListの最も基本的な例」の図と一致しない。
図、または、サンプルコードを修正するか、その両方を修正する必要がある。
図に合わせサンプルコードのみを修正する場合、コードの修正内容は以下のとおり。

String[] choice = { "Lisp", "C++", "Smalltalk", "Java" };

String[] choice = { "1111", "2222", "3333", "4444", "5555", "6666", "7777", "8888" };

サンプルコードを修正する場合には、p.325 のコード解説に再掲されたコードも修正が必要となる。

p.338
String[] choice = { "1111", "2222", "3333", "4444", "5555" };
をコンストラクタ内のローカル変数ではなく、JListTest03A のインスタンス変数として定義すべき。
そうしないと、同ページ内にある次のコメント行を有効にした場合、コンパイルエラーが発生する。
それか、このコメント行を削除すべき。
// String select = choice[selectNo];

p.347
JListTest03.java で使われている getValueIsAdjusting()メソッドの説明がない。
→ getValueIsAdjusting() は、p.340 の「●getValueIsAdjusting()〜選択状態が確定したか」で
説明されているが、初出のここで説明するべき。

p.354
誤:String[] choice = { "Java", "C", "C++", "SmallTalk", "Lisp", "Prolog", "Pascal" };
正:String[] choice = { "Java", "C", "C++", "Smalltalk", "Lisp", "Prolog", "Pascal" };
※ Smalltalk の t は小文字。

p.356, p.358 にも同様の訂正が必要。
それに加えて以下のハードコピーも訂正が必要。
(p.356) ■ListModelを使っていると、項目名を変更できる
(p.360) ■変更・追加・削除ができるようにする

p.357
誤:[Java, C, C++, SmallTalk, Lisp, Prolog, Pascal]
正:[Java, C, C++, Smalltalk, Lisp, Prolog, Pascal]

p.357
「●JListからDefaultListModelを取り出す」のコード解説に再掲されるサンプルコード

JList list = (JList) e.getSource();
System.out.println(list.getModel());

→ System.out.println(list.getModel()); は、
 「●DefaultListModelの内容をダンプする」で解説済み。
 次のコードの方が解説内容に合致する。

DefaultListModel model = (DefaultListModel) list.getModel();

p.360
誤:int ans = JOptionPane.showOptionDialog( frame, obj, "Edit List",
正:int ans = JOptionPane.showOptionDialog( frame, obj, "リスト内容の変更",

p.360
誤:ダイアログボックスに複数のボタンを置くのに、JOptionPane.showOption Dialog()を使う。
正:ダイアログボックスに複数のボタンを置くのに、JOptionPane.showOptionDialog()を使う。
※ showOption Dialog() → showOptionDialog()

p.365
最後の一文
誤:やはり、不透明表示を指示する必要がある。
正:不透明表示を無効にする必要がある。

p.369
誤:それを行うには、独自のList SelectionModel
正:それを行うには、独自のListSelectionModel

p.370
誤:Shiftキーを押さずに、ただ単に項目を連続敵に
正:Shiftキーを押さずに、ただ単に項目を連続的に
※連続敵 → 連続的

p.371
1行目
誤:コンポーネント内の各項目をどのように表示するかを
正:コンポーネント内の各項目をどのように選択するかを
※どのように表示するか → どのように選択するか

p.392
PrimeNumbersTask クラスを以下のように修正するべき。
PrimeNumbersTask のコンストラクタは
JTextArea の引数を取っているので、
それをインスタンス変数に保存するべき。
あるいは、コンストラクタの引数から textArea を削除するか。
    class PrimeNumbersTask extends SwingWorker<List<Integer>, Integer> {

int current = 1;
int numbersToFind = 1;
(追加) JTextArea textArea = null;
public PrimeNumbersTask(JTextArea textArea, int n) {
numbersToFind = n;
(追加) this.textArea = textArea;
}
...
p.392
2は素数だから IsPrimeにおいて n が2の場合 false を返すのは間違い。
    private boolean IsPrime(int n) {

int i = 0;
if (n < 2) return true;
(誤) else if (n == 2) return false;
(正) else if (n == 2) return true;
if (n % 2 == 0) return false;
for (i = 3; i * i <= n; i += 2)
if (n % i == 0) return false;
return true;
}
p.392, p.395
Java の慣習に従い、以下3箇所の IsPrimeメソッド名を isPrime に直すべき。
(p.392) private boolean IsPrime(int n) {
(p.392) b = isPrime(++current);
(p.395) private boolean IsPrime(int n) {

以上
<<Java における各種 XML シリアライザの出力結果 | ホーム | XMLとJavaによるWebアプリケーション開発 第2版 第2版第2刷 正誤表>>

コメント

コメントの投稿

管理者にだけ表示を許可する

画像の文字を半角数字で下記ボックスに記入ください。
文字が読みにくい場合はブラウザの更新をすると新しい文字列が表示されます。