teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

誤記訂正

2017/06/15 03:09

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

answer CHANGED
@@ -82,4 +82,5 @@
82
82
 
83
83
  ---
84
84
  ※1: JLabelへaddメソッドがあるのに使ってはいけない理由
85
- JLabelはswing**子供を持たない**コンポーネントクラス(=JComponent)しかしJComponentは古いGUIライブラリーであるawtの**子供を持てる**コンテナークラス(=Container)の派生として定義されています。これはJComponentがawtの複数のComponentで構成されているという実装の都合によるもので、実際には「子供を配置してはいけないもの」です。addメソッドがコンパイルエラーにならずに呼び出せてしまう理由は単にJComponentがContainerの派生でありContainerにaddメソッドが定義されていたからなんですね。このあたりawt/swingの関係に注意していないとわけがわからないと思います。わかりにくいですね・・・(余談ですがJava8からの標準GUIライブラリーであるJavaFXは、swingとは継承関係がない新規のGUIライブラリーとして設計されており、こうしたいびつなインターフェース上の問題はなくなっています)
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

追記

2017/06/15 03:09

投稿

KSwordOfHaste
KSwordOfHaste

スコア18404

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ライブラリーとして設計されており、こうしたいびつなインターフェース上の問題はなくなっています)