Swing/MultiLineLabel のバックアップの現在との差分(No.2)
TITLE:JTextPane、JLabelなどで複数行を表示
JLabel、JTextAreaなどで複数行を表示
編集者:Terai Atsuhiro~
作成日:2006-06-10
更新日:2021-05-20 (木) 07:50:34
概要
JTextPane
、JTextArea
、JLabel
を使った複数行のラベルをテストします。
Screenshot
Advertisement
概要
JTextPane、JTextArea、JLabelを使った複数行のラベルをテストします。#screenshot
サンプルコード
#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
private final JTextPane label1 = new JTextPane();
private final JTextArea label2 = new JTextArea();
#spandel
private final JLabel label3 = new JLabel();
#spanend
#spanadd
private final JLabel label3 = new JLabel();
#spanend
#spanadd
#spanend
public MainPanel() {
super(new GridLayout(3,1));
super(new GridLayout(3, 1));
ImageIcon icon = new ImageIcon(getClass().getResource("wi0124-32.png"));
SimpleAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setLineSpacing(attr, -0.2f);
label1.setParagraphAttributes(attr, true);
SimpleAttributeSet attr = new SimpleAttributeSet();
StyleConstants.setLineSpacing(attr, -.2f);
label1.setParagraphAttributes(attr, true);
label1.setText("asdfasdfasdfasd\nasdfasdf");
label2.setText("asdfasdfasdfasd\nasdfasdf");
label3.setText("<html>asdfasdfasdfasd<br>asdfasdf");
label1.setText("JTextPane\nasdfasdf");
label2.setText("JTextArea\nasdfasdf");
label3.setText("<html>JLabel+html<br>asdfasdf");
label3.setIcon(icon);
add(setLeftIcon(label1, icon));
add(setLeftIcon(label2, icon));
add(label3);
setPreferredSize(new Dimension(200, 200));
#spanadd
#spanend
setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8));
setPreferredSize(new Dimension(320, 160));
}
#spanadd
#spanend
private static Box setLeftIcon(JTextComponent label, ImageIcon icon) {
label.setForeground(UIManager.getColor("Label.foreground"));
//label.setBackground(UIManager.getColor("Label.background"));
// label.setBackground(UIManager.getColor("Label.background"));
label.setOpaque(false);
label.setEditable(false);
label.setFocusable(false);
label.setMaximumSize(label.getPreferredSize());
label.setMinimumSize(label.getPreferredSize());
JLabel l = new JLabel(icon);
l.setCursor(new Cursor(Cursor.DEFAULT_CURSOR));
l.setCursor(Cursor.getDefaultCursor());
Box box = Box.createHorizontalBox();
box.add(l);
box.add(Box.createHorizontalStrut(2));
box.add(label);
box.add(Box.createHorizontalGlue());
return box;
}
- &jnlp;
- &jar;
- &zip;
解説
- 上:JTextPane
- 文字色、背景色を変更し、編集不可、フォーカスの取得不可にしたJTextPaneを使って複数行を表示しています。SimpleAttributeSetを使って、行間をすこし狭くしています。
解説
- 上:
JTextPane
- 文字色、背景色を変更し、編集不可、フォーカスの取得不可にした
JTextPane
を使用 -
\n
を使用して改行 -
SimpleAttributeSet
を使用して行間を詰めている
- 文字色、背景色を変更し、編集不可、フォーカスの取得不可にした
- 中:
JTextArea
- 文字色、背景色を変更し、編集不可、フォーカスの取得不可にした
JTextArea
を使用 -
\n
を使用して改行
- 文字色、背景色を変更し、編集不可、フォーカスの取得不可にした
- 下:
JLabel
+html
-
JLabel
の文字列にhtml
タグを使用 -
<br>
タグを使用して改行
-
- 中:JTextArea
- 文字色、背景色を変更し、編集不可、フォーカスの取得不可にしたJTextAreaを使って複数行を表示しています。
参考リンク
- 下:JLabel
- htmlの<br>タグを使って、JLabelで複数行表示を表示しています。
コメント
-
JDK 6
で、html
タグを使ったJLabel
での複数行表示がすこし変更(それとも自分の環境のフォントなどが変わっただけ?)されている?ようです(Windows
環境)。行間が詰まって見易くなっているようで、わざわざJTextPane
+SimpleAttributeSet
で行間を調節する必要もなさそうです。 -- aterai -
label.setBackground(UIManager.getColor("Label.background"));
(いつの間にか白になっていた)をlabel.setOpaque(false);
に変更しました。 -- aterai - はじめまして。
Java
初心者なのですが、JLabel
で英字フォントを指定するとギザギザで表示されるのですが、ギザギザをなくすにはどうしたらよいでしょうか?ネットで探すとsetRenderingHint
を使うとできると出てはくるのですが、JLabel
を使った場合の例が出てこなくて。。。ご教授よろしくお願いします。 -- ばしばし- こんばんは。「Java SE 6完全攻略」第17回 文字に対するアンチエイリアス:ITproにいろんな環境での方法がまとめられています。自宅の環境(
Windows XP
+java1.6.0_03
)では、以下のようにオプションを設定して起動するとアンチエイリアスが掛かるようです(XP
の画面のプロパティ、デザイン、効果をClearType
に変更してもなぜかうまくいかない…)。 -- aterai
- こんばんは。「Java SE 6完全攻略」第17回 文字に対するアンチエイリアス:ITproにいろんな環境での方法がまとめられています。自宅の環境(
参考リンク
- XP Style Icons - Windows Application Icon, Software XP Icons
- アイコンを利用しています。
java -Dawt.useSystemAAFontSettings=on -cp ".\target\classes" example.MainPanel
- アイコンを利用しています。
コメント
- JDK 6 で、htmlタグを使ったJLabelでの複数行表示がすこし変更されているみたいです(Windows環境)。行間が詰まって見易くなっているようで、わざわざJTextPane+SimpleAttributeSetで行間を調節する必要もなさそうです。 -- terai
- label.setBackground(UIManager.getColor("Label.background"));*1をlabel.setOpaque(false);に変更しました。 -- terai
- はじめまして。Java初心者なのですが、JLabelで英字フォントを指定するとギザギザで表示されるのですが、ギザギザをなくすにはどうしたらよいでしょうか?ネットで探すと「setRenderingHint」を使うとできると出てはくるのですが、JLabelを使った場合の例が出てこなくて。。。ご教授よろしくお願いします。 -- ばしばし?
- こんばんは。「Java SE 6完全攻略」第17回 文字に対するアンチエイリアス:ITproにいろんな環境での方法がまとめられています。自宅の環境(Windows XP + java1.6.0_03)では、以下のようにオプションを設定して起動するとアンチエイリアスが掛かるようです(XPの画面のプロパティ、デザイン、効果をClearTypeに変更してもなぜかうまくいかない…)。 -- terai
java -Dawt.useSystemAAFontSettings=on -cp ".\target\classes" example.MainPanel
- こんばんは。「Java SE 6完全攻略」第17回 文字に対するアンチエイリアス:ITproにいろんな環境での方法がまとめられています。自宅の環境(Windows XP + java1.6.0_03)では、以下のようにオプションを設定して起動するとアンチエイリアスが掛かるようです(XPの画面のプロパティ、デザイン、効果をClearTypeに変更してもなぜかうまくいかない…)。 -- terai
- ありがとうございます。なるほど、いろいろ書かれていますね!明日試してみます! -- ばしばし?
- こんにちは。当方の環境がJDK1.5であったので、非標準の「-Dswing.aatext=true」を設定するとアンチエイリアスがかかりました。けれども、標準ではどうするのかと言う疑問が。。。 -- ばしばし?
- ども。Sunに「1.5にも標準のオプション用意して」とお願いする…のはひとまず置いといて…。「Java Swing Hacks」本では、テキストにアンチエイリアスを適用するためだけのLook & Feel(Wrap Look And Feel - L2FProd.com)を使用する方法が紹介(HACK#52)されています。これを使えば、「-Dswing.aatext=true」無しで、1.5でもアンチエイリアスが掛かります。 -- terai
- もし、一部のJLabelをアンチエイリアスするだけでいいのなら、以下のようにJLabel#paintComponentメソッドをオーバーライドしてしまうのが手っ取り早いかもしれません。 -- terai
- ありがとうございます。なるほど、いろいろ書かれていますね!明日試してみます! -- ばしばし
- こんにちは。当方の環境が
JDK1.5
なので、非標準の-Dswing.aatext=true
を設定するとアンチエイリアスがかかりました。けれども、標準ではどうするのかと言う疑問が。。。 -- ばしばし- ども。Sunに「
1.5
にも標準のオプション用意して」とお願いする…のはひとまず置いといて…。Java Swing Hacks
本では、テキストにアンチエイリアスを適用するためだけのLook & Feel
(Wrap Look And Feel - L2FProd.com)を使用する方法が紹介(HACK#52
)されています。これを使えば、-Dswing.aatext=true
無しで、1.5
でもアンチエイリアスが掛かります。 -- aterai - もし、一部の
JLabel
をアンチエイリアスするだけでいいのなら、以下のようにJLabel#paintComponent
メソッドをオーバーライドしてしまうのが手っ取り早いかもしれません。 -- aterai
- ども。Sunに「
JLabel label = new JLabel("asdfasdfasdf") {
@Override
protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D)g;
@Override protected void paintComponent(Graphics g) {
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING,
RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
g2d.setRenderingHint(RenderingHints.KEY_RENDERING,
RenderingHints.VALUE_RENDER_QUALITY);
super.paintComponent(g2d);
}
};
- お返事遅くなりましたm(__)m。試してみます!ありがとうございます! -- ばしばし?
- JLabelでhtmlを使用するとsetEnabled(false)でグレーアウトしてくれないです。どうしたものでしょう。 -- ApplePedlar?
- Bug ID: 4740519 HTML JLabel not greyed out on setEnabled(false)ですね。今のところ、Swing - JLabel with html tag can not be disabled or setForegroud?!みたいに
逃げるしかない?みたいです。する方法があります。 -- terai - コードが長くなってしまったので、別ページを作成しました。JEditorPaneを使用する方法も追加しています。Htmlを使ったJLabelとJEditorPaneの無効化 -- terai
- Bug ID: 4740519 HTML JLabel not greyed out on setEnabled(false)ですね。今のところ、Swing - JLabel with html tag can not be disabled or setForegroud?!みたいに
- お返事遅くなりましたm(__)m。試してみます!ありがとうございます! -- ばしばし
-
JLabel
でhtml
を使用するとsetEnabled(false)
でグレーアウトしてくれないです。どうしたものでしょう。 -- ApplePedlar- Bug ID: 4740519 HTML JLabel not greyed out on setEnabled(false)ですね。今のところ、Swing - JLabel with html tag can not be disabled or setForegroud?!みたいに
逃げるしかない?みたいです。する方法があります。 -- aterai - コードが長くなってしまったので、別ページを作成しました。
JEditorPane
を使用する方法も追加しています。Htmlを使ったJLabelとJEditorPaneの無効化 -- aterai
- Bug ID: 4740519 HTML JLabel not greyed out on setEnabled(false)ですね。今のところ、Swing - JLabel with html tag can not be disabled or setForegroud?!みたいに
- こんにちは。ココのおかげでとても助かっています。ところで、
1
行の高さ(文字の高さを含めた高さ)を指定したい、というときには、setLineSpacing
ではダメってことですよね?「指定したい高さ-フォントの大きさ」をsetLineSpacing
で指定してあげなきゃいけないんですよね?(文字サイズによって1
行の高さが揃わなくなるのはイヤで揃えたいなと思うのですが、フォントによってそれだと、そうすると、フォントの大きさを変えるたびに指定しなおさなきゃいけないってことですよね。面倒…) -- びびあず- こんにちは。どういたしまして。
LineSpacing
はフォントサイズに依存するみたいですね。固定の間隔を指定するのなら、例えば以下のように、ParagraphView#getBottomInset
メソッドなどをオーバーライドするのが簡単かも。 -- aterai - ソースコードをJEditorPaneやJTextPaneに行間を設定するに移動しました。 -- aterai
- こんにちは。どういたしまして。
- (変な日本語を書いてましたね、失礼しました。) ところで…、さっそくご親切にソースまで書いて教えていただけて嬉しいです。ありがとうございました。これを参考にして、また勉強したいと思います。本当にありがとうございました。 -- びびあず
-
Swing
初心者です。JTextPane
での複数行表示、大変参考になりました。複数行表示自体はおかげ様でうまくいったのですが、ボーダーが思い通りにならず困っています。TitledBorder
を設定しているのですが、タイトルを囲む線の外側(コンポーネントの枠)がくぼんだ状態になってしまいます。外枠は表示させたくないのですが、どこかでOFF
できるのでしょうか。ご教授いただければ幸いです。 -- ka-ka- こんばんは。
TitledBorder
の枠線を変更する場合は、label.setBorder(BorderFactory.createTitledBorder(BorderFactory.createEmptyBorder(), "title"));
のように、他のBorder
(この場合、EmptyBorder
で非表示にしている)と組み合わせて使用します。TitledBorder (Java Platform SE 8) -- aterai
- こんばんは。
- ありがとうございます。
NetBeans
で開発しているのですが、あ~でもないこ~でもないとプロパティ画面をいじっていたら、JScrollPane
とJTextPane
の組み合わせで思い描いたものはできました。Swing
もNetBeans
も初めてなので色々と思い通りにできずに四苦八苦しております。。。今後ともこちらのサイトで勉強させていただきます! -- ka-ka