TITLE:JTextPane、JLabelなどで複数行を表示

JLabel、JTextAreaなどで複数行を表示

Posted by terai at 2006-06-10

概要

JTextPane、JTextArea、JLabelを使った複数行のラベルをテストします。

  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

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(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
  Box box = Box.createHorizontalBox();
  box.add(l);
  box.add(Box.createHorizontalStrut(2));
  box.add(label);
  box.add(Box.createHorizontalGlue());
  return box;
}

解説

  • 上:JTextPane
    • 文字色、背景色を変更し、編集不可、フォーカスの取得不可にしたJTextPaneを使って複数行を表示しています。SimpleAttributeSetを使って、行間をすこし狭くしています。
  • 中:JTextArea
    • 文字色、背景色を変更し、編集不可、フォーカスの取得不可にしたJTextAreaを使って複数行を表示しています。
  • 下:JLabel
    • htmlの<br>タグを使って、JLabelで複数行表示を表示しています。

参考リンク

コメント

  • 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
  • ありがとうございます。なるほど、いろいろ書かれていますね!明日試してみます! -- ばしばし
  • こんにちは。当方の環境が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
      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。試してみます!ありがとうございます! -- ばしばし
  • JLabelでhtmlを使用するとsetEnabled(false)でグレーアウトしてくれないです。どうしたものでしょう。 -- ApplePedlar