- PR -

下線付きフォント

1
投稿者投稿内容
まさ
ベテラン
会議室デビュー日: 2002/11/15
投稿数: 74
投稿日時: 2003-05-19 19:45
まさです。はじめまして。

JLabel などで、
下線付きフォントを表示したいのですが
自分で下線をひくしかないのでしょうか?

Runtime は 1.3.1 です。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-05-20 09:37
JLabelならコンストラクタか、setTextメソッドにhtml表現で下線をつけられます。
例えば,
コード:
JLabel label = new JLabel("<html><u>ラベル</u></html>");


みたいに。JLabel以外にもできて、同様にhtmlで指定すれば、フォントの設定や、
複数行表示、中央詰めなど簡単にできますよ。

#ただし多用すると少し重くなるかも
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2003-05-20 20:19
あまり良くないですが、JLabelのサブクラスの例です。参考になるかどうか…。
このままでは途中でアンダーラインの on/off切り換えても自動で再描画しませんので、あしからず。
コード:
/*
 * @(#)UnderlinedLabel.java     1.4     03/27/03
 * @(#)Copyright (C) 2001, 2002 Lightweight Technologies
 *
 * 18.Mar.2001  kei
 * 1.Apr.2001
 * 8.May.2001
 * 16.May.2001  add get, setMenu
 *
 * 14.16.Jan.2002       jp.lwt
 * 20.Mar.2002  spacing
 * 27.Mar.2003  from jp.lwt.swing package
 */

package jp.j2se.swing;

import java.awt.*;
import java.awt.font.*;
import java.awt.geom.*;
import javax.swing.*;

/**
 * アンダーラインによる修飾可能なラベルです。
 * <p>
 * setUnderline で true または false を指定することにより,ラベ
 * ル・テキストに下線を表示、非表示にすることができます。
 * </p>
 *
 * @author Kei Moses Kissinger
 * @version 1.4, Copyright (C) 2001, 2002 Lightweight Technologies
 */
public class UnderlinedLabel extends JLabel {
        /** SCCS ID */
        private static final String sccsId =
                "@(#)UnderlinedLabel.java       1.4 " +
                "03/27/03 " +
                "Copyright (C) 2001, 2002 Lightweight Technologies";

        /**
         * アンダーラインがあることを示します。
         */
        protected boolean underlined = false;

        /**
         * UnderlinedLabel のインスタンスを、タイトルをイメージ
         * なしの空の文字列で作成します。
         * <p>
         * ラベルは、表示領域内で垂直方向に中央揃えされます。<br>
         * ラベルの内容が設定されると、ラベルは表示領域のリーデ
         * ィングエッジに表示されます。
         * </p>
         */
        public UnderlinedLabel() {
                this("");
        }

        /**
         * UnderlinedLabel のインスタンスを、指定されたテキスト
         * で作成します。
         * <p>
         * ラベルは、表示領域のリーディングエッジに揃えられ、垂
         * 直方向に中央揃えされます。
         * </p>
         *
         * @param text ラベルに表示されるテキスト
         */
        public UnderlinedLabel(String text) {
                this(text, LEADING);
        }

        /**
         * UnderlinedLabel のインスタンスを、指定されたテキスト
         * と水平方向の配置方法で作成します。
         * <p>
         * ラベルは、表示領域内で垂直方向に中央揃えされます。
         * </p>
         *
         * @param text ラベルに表示されるテキスト
         * @param horizontalAlignment SwingConstants で定義され
         *      ている定数 LEFT、CENTER、RIGHT、LEADING、または
         *      TRAILING のうちの 1 つ
         */
        public UnderlinedLabel(String text, int horizontalAlignment) {
                super(text, horizontalAlignment);
        }

        /**
         * preferredSize が null 以外の値に設定されている場合に
         * その値を返します。
         * <p>
         * UI 委譲の getPreferredSize() メソッドが null 以外の値
         * を返す場合は、その値を返します。そうでない場合はコン
         * ポーネントレイアウトマネージャに従います。
         * </p>
         *
         * return preferredSize プロパティの値
         */
        public Dimension getPreferredSize() {
                Dimension dim = super.getPreferredSize();
                Font font = getFont();

                /* 暫定 少し大きめにする。 */
                dim.width = dim.width * 109 / 100;
                if (font.isBold())
                        dim.width = dim.width * 112 / 100;
                if (font.isItalic())
                        dim.width = dim.width * 114 / 100;

                return dim;
        }

        /**
         * UI 委譲が null 以外の場合、その paint メソッドを呼び
         * 出します。
         * <p>
         * その委譲先に Graphics オブジェクトのコピーを渡して、
         * 取り消せない変更 (Graphics.translate() など) から描画
         * コードのほかの部分を保護します。
         * </p>
         *
         * @param g コンテキスト
         */
        protected void paintComponent(Graphics g) {
                Graphics2D g2 = (Graphics2D)g;
                g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                        RenderingHints.VALUE_ANTIALIAS_ON);
                super.paintComponent(g);
                if (underlined) {
                        FontMetrics f = g.getFontMetrics();
                        int w = f.stringWidth(getText());
                        int y = f.getAscent() + 1;
                        g.drawLine(0, y, w, y);
                }
        }

        /**
         * アンダーラインを設定します。
         *
         * @param b true : あり false : なし
         */
        public void setUnderline(boolean b) {
                underlined = b;
        }
}

まさ
ベテラン
会議室デビュー日: 2002/11/15
投稿数: 74
投稿日時: 2003-05-21 17:06
Wata さん、Kissinger さん
返信ありがとうございます。

HTML タグを各方法を除くと、
やはり自分でひくしかなさそうですね…


以下余談ですが、
java.awt.Font クラスに下線の設定が無いのはなぜなんでしょう?
下線付きフォントってプラットフォーム依存なんでしょうか?
さくらば
大ベテラン
会議室デビュー日: 2002/11/12
投稿数: 145
投稿日時: 2003-05-22 13:32
こんにちは、さくらばです。

引用:

まささんの書き込み (2003-05-21 17:06) より:
以下余談ですが、
java.awt.Font クラスに下線の設定が無いのはなぜなんでしょう?
下線付きフォントってプラットフォーム依存なんでしょうか?



余談に反応するのもなんですが...
下線の設定は Font クラスではなくて、java.text.AttributedString で行います。
AttributedString クラスは文字列の一部分にいろいろなアトリビュートをつける
ためのクラスです。

これを描画するには java.text.AttributedCharacterIterator に変換してから行
うようにします。

JLabel などはこのクラスを使わないで、単に String 型のオブジェクトを書いて
いるだけなので装飾を行うには HTML にしないとだめなようです。

一応、AttributedString の単純なサンプルをのせておきます。

コード:
import java.awt.*;
import java.awt.font.TextAttribute;
import java.text.AttributedCharacterIterator;
import java.text.AttributedString;
import javax.swing.*;

public class UnderlineTextTest extends JComponent {

    private AttributedCharacterIterator it;

    public UnderlineTextTest() {
        AttributedString attrStr = new AttributedString("Underline");

        // 1 文字目は Bold | Italic な 24pt の sanserif で色は赤
        attrStr.addAttribute(TextAttribute.FONT,
                             new Font("sanserif", Font.BOLD | Font.ITALIC, 24), 0, 1);
        attrStr.addAttribute(TextAttribute.FOREGROUND, Color.RED, 0, 1);

        // 2 文字目以降は Bold な 20 pt の sanserif
        attrStr.addAttribute(TextAttribute.FONT,
                             new Font("sanserif", Font.BOLD, 20), 1, 9);

        // アンダーラインの設定
        attrStr.addAttribute(TextAttribute.UNDERLINE, TextAttribute.UNDERLINE_ON, 0, 9);
        
        it = attrStr.getIterator();
    }

    public void paintComponent(Graphics g) {
        g.drawString(it, 20, 20);
    }

    public static void main(String[] args) {
        JFrame frame = new JFrame("Test");
        frame.getContentPane().add(new UnderlineTextTest());
        frame.setBounds(100, 100, 200, 100);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    }
}


Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2003-05-22 21:08
java.textパッケージではコレータやフォーマット関連しか使ったことなかったので、
さくらばさんには、いい方法教えてもらいました。 ありがとうございます。
Wata
ぬし
会議室デビュー日: 2003/05/17
投稿数: 279
投稿日時: 2003-05-23 09:31
java.textに文字列に属性を設定するクラスがあるのは知ってたけど(知ったのは最近)、
使い道を知りませんでした。ops
Graphics#drawStringが対応してたんですね。目から鱗。
これはjavax.swingパッケージばっか見てても気づかないなー

[ メッセージ編集済み 編集者: Wata 編集日時 2003-05-23 09:33 ]
1

スキルアップ/キャリアアップ(JOB@IT)