回答編集履歴
2
誤記訂正
answer
CHANGED
@@ -82,4 +82,5 @@
|
|
82
82
|
|
83
83
|
---
|
84
84
|
※1: JLabelへaddメソッドがあるのに使ってはいけない理由
|
85
|
-
JLabelはswing
|
85
|
+
JLabelはswingにおける「**子供を持たない**コンポーネントクラス(=JComponent)」として定義されています。しかしJComponentは古いGUIライブラリーであるawtでの「**子供を持てる**コンテナークラス(=Container)」の派生として定義されています。
|
86
|
+
これはJComponentがawtの複数のComponentで構成されているという実装の都合によるもので、実際には「子供を配置してはいけないもの」です。addメソッドがコンパイルエラーにならずに呼び出せてしまう理由は単にJComponentがContainerの派生でありContainerにaddメソッドが定義されていたからなんですね。このあたりawt/swingの関係に注意していないとわかりにくいですね・・・(余談ですがJava8からの標準GUIライブラリーであるJavaFXは、swingとは継承関係がない新規のGUIライブラリーとして設計されており、こうしたいびつなインターフェース上の問題はなくなっています)
|
1
追記
answer
CHANGED
@@ -74,5 +74,12 @@
|
|
74
74
|
```
|
75
75
|
|
76
76
|
---
|
77
|
+
補足1: 元のコードでは配列aに色を付けたJLabelがあらかじめ定義されているので、自分のコード例にある`new ColorLabel("赤いワイヤー", Color.RED)`の代わりに`a[0]`と書きたくなるかも知れません。しかしそれはお勧めしません。swingのコンポーネントはあるインスタンスを画面上の複数個所に配置できないからです。面倒でも個別に`new ColorLabel...`のようにしてインスタンスを生成する必要があります。
|
78
|
+
|
79
|
+
補足2: 色付きのテキストをJLabelの並びで表現するのは最も素直な方法とはいえないかも知れません。JLabelの設定テキストにはHTML形式の文字列を指定できるので以下のようにするのも手段の一つになるかも知れません。
|
80
|
+
`new JLabel("<html><head></head><body>ア)<font color='red'>赤いワイヤー</font>...")`
|
81
|
+
またJTextPaneには色などの属性付きのテキストを表現できるのでそれを使うのも一つの方法ですが、いずれにしても若干面倒なコードになります。
|
82
|
+
|
83
|
+
---
|
77
84
|
※1: JLabelへaddメソッドがあるのに使ってはいけない理由
|
78
85
|
JLabelはswingの**子供を持たない**コンポーネントクラス(=JComponent)しかし、JComponentは古いGUIライブラリーであるawtの**子供を持てる**コンテナークラス(=Container)の派生として定義されています。これはJComponentがawtの複数のComponentで構成されているという実装の都合によるもので、実際には「子供を配置してはいけないもの」です。addメソッドがコンパイルエラーにならずに呼び出せてしまう理由は単にJComponentがContainerの派生でありContainerにaddメソッドが定義されていたからなんですね。このあたりawt/swingの関係に注意していないとわけがわからないと思います。わかりにくいですね・・・(余談ですがJava8からの標準GUIライブラリーであるJavaFXは、swingとは継承関係がない新規のGUIライブラリーとして設計されており、こうしたいびつなインターフェース上の問題はなくなっています)
|