3

HTML をレンダリングする JLabel が出力テキストの垂直位置をシフトするのに対し、非 HTML をレンダリングする JLabel はシフトしない理由を理解したいと思います。

  • 使用する Java バージョン: 1.6.0_37
  • 使用される Swing ルック アンド フィール: Windows ("com.sun.java.swing.plaf.windows.WindowsLookAndFeel")
  • OS : Windows 7 64 ビット

コードは本当に些細なことなので、SSCCE はまとめませんでした。しかし、それが助けになるなら、そう言ってください。

むしろ、動作を表示する画像を使用して例を示します。

プレーンテキストと HTML をレンダリングする JLabel の例

ラベルの境界を視覚化するために、JLabel の周りに JPanel をコンテナーとして配置しました。JLabel のフォントとテキストを設定すると、

jLabel.getPreferredSize()

メソッドは、レンダリングされたプレーン テキストまたは HTML の境界を返します (これは、周囲の JPanel に設定した正確なサイズです)。HTML をレンダリングすると、テキスト全体が少し下に移動することがはっきりとわかります。

これが発生する理由と、配置を修正するためにできることを知りたいです。

1 つの回避策は、次のように、テキストをレンダリングする Graphics2D を変換して、垂直シフトを補正することです。

g2d.translate( 0, -20 );

しかし、フォント メトリック (フォント サイズなど) に関連する正しい y 値がわかりません。とにかく、この回避策も「間違っている」と感じます。

私は本当にあなたの答えに感謝します、ありがとう!

4

1 に答える 1

2

フォントを使用Fontして HTML に (ファミリ、サイズなど)を設定すると、正しいメトリックにレンダリングされないようです。JLabelsetFont(..)JLabel

これは私がデモンストレーションのために作った例です(JLabel示されている両方の s は HTML を使用しています):

ここに画像の説明を入力

簡単な回避策は、HTML のフォント サイズ、ファミリなどにもあります。

緑のHTMLが HTMLを使用してフォントを設定し、正しくレンダリングされているのに対し、シアンのHTMLがJLabel使用されているsetFont(..)(そして正しくレンダリングされていない)ことがわかります。JLabel

JLabel labelHtml2 = new JLabel("<html><font size=10 family='Calibri'>" + text + "</font></html>");

テスト.java:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;

public class Test {

    public static Font font = new Font("Calibri", Font.PLAIN, 38);

    public Test() {
        initComponents();
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();

                }
                new Test();
            }
        });
    }

    private void initComponents() {
        final JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        String text = "Hello world";

        //this label will not render correctly due to setting font via setFont(..)
        JLabel labelHtml1 = new JLabel("<html>" + text + "</html>");
        labelHtml1.setBackground(Color.CYAN);
        labelHtml1.setOpaque(true);//so background will be painted
        labelHtml1.setFont(font);

        //this label will render correcty font is set via html
        JLabel labelHtml2 = new JLabel("<html><font size=10 family='Calibri'>" + text + "</font></html>");
        labelHtml2.setBackground(Color.GREEN);
        labelHtml2.setOpaque(true);
        //labelHtml2.setFont(font);

        frame.add(labelHtml1, BorderLayout.NORTH);
        frame.add(labelHtml2, BorderLayout.SOUTH);

        frame.pack();
        frame.setVisible(true);

    }
}
于 2012-11-04T15:21:22.013 に答える