12

特定の目的のために特別なコンポーネントを作成しようとしています。そのコンポーネントでHTML文字列を描画する必要があります。サンプルコードは次のとおりです。

 public class MyComponent extends JComponent{
     public MyComponent(){
        super();
     }

     protected void paintComponent(Graphics g){
        //some drawing operations...
        g.drawString("<html><u>text to render</u></html>",10,10);
     }
 }

残念ながら、drawStringメソッドはHTML形式を認識していないようで、文字列をそのままのようにばかげて描画します。

それを機能させる方法はありますか?

4

7 に答える 7

12

Java2Dのファンなら; ただし、SwingコンポーネントとレイアウトでHTMLを最大限に活用するには、@camickrによって提案されたコンポーネントアプローチを使用することをお勧めします。必要に応じて、、などに見られるフライウェイトレンダラーアプローチを使用できます。このアプローチで単一のコンポーネントを繰り返し使用して描画します。以下の例は、色と場所のみを変更した、非常に単純化された手法の概要です。JTable

補遺:更新された例; も参照して、アプリを飛ばしCellRendererPaneください:パフォーマンスを向上させるためにFlyweightを実装してください

ここに画像の説明を入力してください

import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import javax.swing.CellRendererPane;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

/** @see http://stackoverflow.com/questions/7774960 */
public class PaintComponentTest extends JPanel {

    private static final int N = 8;
    private static final String s = "<html><big><u>Hello</u></html>";
    private JLabel renderer = new JLabel(s);
    private CellRendererPane crp = new CellRendererPane();
    private Dimension dim;

    public PaintComponentTest() {
        this.setBackground(Color.black);
        dim = renderer.getPreferredSize();
        this.add(crp);
    }

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        for (int i = 0; i < N; i++) {
            renderer.setForeground(Color.getHSBColor((float) i / N, 1, 1));
            crp.paintComponent(g, renderer, this,
                i * dim.width, i * dim.height, dim.width, dim.height);
        }
    }

    private void display() {
        JFrame f = new JFrame("PaintComponentTest");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.add(this);
        f.pack();
        f.setSize(dim.width * N, dim.height * (N + 1));
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                new PaintComponentTest().display();
            }
        });
    }
}
于 2011-10-15T06:24:19.090 に答える
10

他の人がコメントしているように、SwingコンポーネントはHTML3.2と基本的なスタイルをサポートしています。

メソッドでその機能を活用する方法の詳細については、このスレッドのソースをpaintComponent(Graphics)参照してください。LabelRenderTest.java

アプローチは、ラベルを画像にレンダリングしてから、画像をGraphicsオブジェクトにレンダリングすることです。

于 2011-10-15T04:19:52.473 に答える
6

あなたの質問に対する答えは、HTMLはサポートされていないということです。

簡単な解決策は、Swingコンポーネントを使用して、それらを適切にレイアウトすることです。

自分でやりたい場合は、drawString()メソッドに使用するフォントを操作する必要があります。イタリック、太字などのフォントを使用できます。

于 2011-10-15T02:39:35.953 に答える
6

paintHtmlString;をシミュレートするための短くてクリーンな方法を見つけました。コードは次のとおりです。

public class MyComponent extends JComponent {

    private JLabel label = null;

    public MyComponent() {
        super();
    }

    private JLabel getLabel() {
        if (label == null) {
            label = new JLabel();
        }
        return label;
    }

    /**
     * x and y stand for the upper left corner of the label
     * and not for the baseline coordinates ...
     */
    private void paintHtmlString(Graphics g, String html, int x, int y) {
        g.translate(x, y);
        getLabel().setText(html);
        //the fontMetrics stringWidth and height can be replaced by
        //getLabel().getPreferredSize() if needed
        getLabel().paint(g);
        g.translate(-x, -y);
    }

    protected void paintComponent(Graphics g) {
        //some drawing operations...
        paintHtmlString(g, "<html><u>some text</u></html>", 10, 10);
    }
}

皆様のご協力に感謝申し上げます。

于 2011-10-15T14:19:02.617 に答える
5

これは実装する方法ではありません。

このdrawString(String str, int x, int y)グラフィックスコンテキストの現在のフォントと色を使用して、指定された文字列で指定されたテキストを描画するだけです。

問題の詳細については、SwingコンポーネントでHTMLを使用する方法を参照してください。

于 2011-10-15T02:40:17.003 に答える
4

JLabel基本クラスとして使用します。Graphics.drawString()できるのは...文字列を描くことだけです。

于 2011-10-15T00:48:13.623 に答える
2

HTMLをレンダリングしてグラフィックスでペイントする簡単な方法はありません。JLabelを使用してください。

ただし、HTMLを使用してJLabelを作成し、そのグラフィックをコンポーネントにペイントすることで、これを実現する興味深い方法があります。

private JLabel label;

public MyComponent() {
    label = new JLabel("Before Red");
    label.setText("<html><u>test</u></html>");
    this.add(label);
}

public void repaint(Graphics g){
    g = label.getGraphics();
}

これを実現する最も簡単な方法は、グラフィックのフォントを設定することです。次に例を示します。

public void repaint(Graphics g){    
    Font f = new Font("Courier", Font.BOLD, 12);
    g.setFont(f);
    g.drawString("Bolded Courier", 5, 15);
}
于 2011-10-15T02:45:13.530 に答える