TITLE:JTextPane、JLabelなどで複数行を表示
#navi(../)
*JLabel、JTextAreaなどで複数行を表示 [#k03fb08c]
>編集者:[[Terai Atsuhiro>terai]]~
作成日:2006-06-10~
更新日:&lastmod;

#contents

**概要 [#e9b92ec1]
JTextPane、JTextArea、JLabelを使った複数行のラベルをテストします。

#screenshot

**サンプルコード [#j2554de9]
#code{{
private final JTextPane label1 = new JTextPane();
private final JTextArea label2 = new JTextArea();
private final JLabel    label3 = new JLabel();
public MainPanel() {
  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); 

  label1.setText("asdfasdfasdfasd\nasdfasdf");
  label2.setText("asdfasdfasdfasd\nasdfasdf");
  label3.setText("<html>asdfasdfasdfasd<br>asdfasdf");
  label3.setIcon(icon);

  add(setLeftIcon(label1, icon));
  add(setLeftIcon(label2, icon));
  add(label3);
  setPreferredSize(new Dimension(200, 200));
}
private static Box setLeftIcon(JTextComponent label, ImageIcon icon) {
  label.setForeground(UIManager.getColor("Label.foreground"));
  //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));
  Box box = Box.createHorizontalBox();
  box.add(l);
  box.add(Box.createHorizontalStrut(2));
  box.add(label);
  box.add(Box.createHorizontalGlue());
  return box;
}
}}
-&jnlp;
-&jar;
-&zip;

**解説 [#m912719c]
-上:JTextPane
--文字色、背景色を変更し、編集不可、フォーカスの取得不可にしたJTextPaneを使って複数行を表示しています。SimpleAttributeSetを使って、行間をすこし狭くしています。

-中:JTextArea
--文字色、背景色を変更し、編集不可、フォーカスの取得不可にしたJTextAreaを使って複数行を表示しています。

-下:JLabel
--htmlの<br>タグを使って、JLabelで複数行表示を表示しています。

**参考リンク [#bcf44b9c]
-[[XP Style Icons - Windows Application Icon, Software XP Icons>http://www.icongalore.com/]]
--アイコンを利用しています。

**コメント [#h1e6b5a0]
- JDK 6 で、htmlタグを使ったJLabelでの複数行表示がすこし変更されているみたいです(Windows環境)。行間が詰まって見易くなっているようで、わざわざJTextPane+SimpleAttributeSetで行間を調節する必要もなさそうです。 -- [[terai]] &new{2007-01-10 (水) 12:44:53};
- label.setBackground(UIManager.getColor("Label.background"));((いつの間にか白になっていた))をlabel.setOpaque(false);に変更しました。 -- [[terai]] &new{2007-10-01 (月) 12:12:55};
- はじめまして。Java初心者なのですが、JLabelで英字フォントを指定するとギザギザで表示されるのですが、ギザギザをなくすにはどうしたらよいでしょうか?ネットで探すと「setRenderingHint」を使うとできると出てはくるのですが、JLabelを使った場合の例が出てこなくて。。。ご教授よろしくお願いします。 -- [[ばしばし]] &new{2007-10-17 (水) 20:16:10};
-- こんばんは。[[「Java SE 6完全攻略」第17回 文字に対するアンチエイリアス:ITpro>http://itpro.nikkeibp.co.jp/article/COLUMN/20070205/260649/]]にいろんな環境での方法がまとめられています。自宅の環境(Windows XP + java1.6.0_03)では、以下のようにオプションを設定して起動するとアンチエイリアスが掛かるようです(XPの画面のプロパティ、デザイン、効果をClearTypeに変更してもなぜかうまくいかない…)。 -- [[terai]] &new{2007-10-17 (水) 21:54:38};
 java -Dawt.useSystemAAFontSettings=on -cp ".\target\classes" example.MainPanel
- ありがとうございます。なるほど、いろいろ書かれていますね!明日試してみます! -- [[ばしばし]] &new{2007-10-17 (水) 23:59:34};
- こんにちは。当方の環境がJDK1.5であったので、非標準の「-Dswing.aatext=true」を設定するとアンチエイリアスがかかりました。けれども、標準ではどうするのかと言う疑問が。。。 -- [[ばしばし]] &new{2007-10-18 (木) 09:37:28};
-- ども。Sunに「1.5にも標準のオプション用意して」とお願いする…のはひとまず置いといて…。「Java Swing Hacks」本では、テキストにアンチエイリアスを適用するためだけのLook & Feel([[Wrap Look And Feel - L2FProd.com>http://wraplf.l2fprod.com/]])を使用する方法が紹介(HACK#52)されています。これを使えば、「-Dswing.aatext=true」無しで、1.5でもアンチエイリアスが掛かります。 -- [[terai]] &new{2007-10-18 (木) 14:42:33};
-- もし、一部のJLabelをアンチエイリアスするだけでいいのなら、以下のようにJLabel#paintComponentメソッドをオーバーライドしてしまうのが手っ取り早いかもしれません。 -- [[terai]] &new{2007-10-18 (木) 15:16:04};
#code{{
JLabel label = new JLabel("asdfasdfasdf") {
  @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。試してみます!ありがとうございます! -- [[ばしばし]] &new{2007-10-22 (月) 09:57:29};
- JLabelでhtmlを使用するとsetEnabled(false)でグレーアウトしてくれないです。どうしたものでしょう。 -- [[ApplePedlar]] &new{2007-12-11 (火) 17:34:00};
-- [[Bug ID: 4740519 HTML JLabel not greyed out on setEnabled(false)>http://bugs.sun.com/view_bug.do?bug_id=4740519]]ですね。今のところ、[[Swing - JLabel with html tag can not be disabled or setForegroud?!>http://forum.java.sun.com/thread.jspa?threadID=735190]]みたいに逃げるしかない?みたいです。 -- [[terai]] &new{2007-12-11 (火) 18:27:05};
#code{{
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class MainPanel extends JPanel {
  public MainPanel() {
    super(new BorderLayout());
    final JLabel label = new JLabel("<html>Html label<br> Test") {
      // Swing - JLabel with html tag can not be disabled or setForegroud?!
      // http://forum.java.sun.com/thread.jspa?threadID=735190
      public void setEnabled(boolean b) {
        super.setEnabled(b);
        setForeground(b ? (Color) UIManager.get("Label.foreground")
                        : (Color) UIManager.get("Label.disabledForeground"));
      }
    };
    label.setEnabled(false);
    JCheckBox cbox = new JCheckBox(new AbstractAction("setEnabled") {
      public void actionPerformed(ActionEvent evt) {
        JCheckBox cb = (JCheckBox)evt.getSource();
        label.setEnabled(cb.isSelected());
      }
    });
    add(cbox, BorderLayout.NORTH);
    add(label, BorderLayout.CENTER);
    setPreferredSize(new Dimension(200, 100));
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    try{
      UIManager.getInstalledLookAndFeels();
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    }catch(Exception e) {
      e.printStackTrace();
    }
    final JFrame frame = new JFrame("@title@");
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.getContentPane().add(new MainPanel());
    frame.pack();
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}
}}

#comment