1

ユーザーに注釈を付けたい特定のテキストがあります。残念ながら、どこから始めればよいかさえわかりません。私のアルゴリズムは、文字列の範囲を出力として提供します。私が目指しているのは、次のようなものです。

例

キャラクターにマーカーを付ける(青い線、赤い線)、おそらくキャラクターを反転させる(キャラクターに別の背景を与える)、または太らせるには2つの方法が必要です。特に難しいのは、写真 (ここでは 2 つの黒い点で示されています) を文字に合わせることです。文字はCourier Newにあるはずなので、オフセットをどこに置くかはわかりましたが、できないようです。

最後に、図のように、X 文字の後に改行を適用して新しい行を開始する必要があります。Javaでこれにアプローチする方法の例はまだ見つかりません。PythonではImageDrawを使用できましたが、Javaでは水がありません。

これを画面上のキャンバスに表示し、これを svg または pdf としてエクスポートすることは可能ですか? これを実行できるライブラリを知りません。したがって、この方法でもいくつかの提案/例を受け取っていただければ幸いです。

4

3 に答える 3

1

重要なのは、FontMetrics API を処理することです。あなたができる最善のことは、この参照ドキュメントを見ることです。

この使用法を示すサンプル コードを次に示します。文字の範囲に従って、「Hello world」テキストの周りに赤と青の線を描画します。

テキストは JLabel 内にありますが、ペイント メソッドを任意のコンポーネントに適応させることができます (ただしgraphics.drawChars、テキストをペイントするには呼び出す必要があります)。

(コードはあまり良くありませんが、FontMetrics の使用法を示しています)

package com.example.swing;

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

public class DemoFontMetrics {

    public static void main(String[] args){
        JFrame frame = new JFrame();
        DecoratedLabel label = new DecoratedLabel("hello world !",new int[]{2,4}, new int[]{6,9});
        JPanel textContainer = new JPanel(new FlowLayout());
        textContainer.setBorder(BorderFactory.createEmptyBorder(5,5,5,5));
        textContainer.add(label);
        frame.getContentPane().add(textContainer);
        frame.pack();
        frame.setVisible(true);
    }

    private static class DecoratedLabel extends JLabel{

        int startBlue;
        int endBlue;
        int startRed;
        int endRed;

        private DecoratedLabel(String text, int[] blueRange, int[] redRange) {
            super(text);
            startBlue = blueRange[0];
            endBlue = blueRange[1];
            startRed = redRange[0];
            endRed = redRange[1];
        }

        @Override
        public void paint(Graphics g) {
            super.paint(g);   //draw text

            //set line with : 3
            Stroke stroke = new BasicStroke(3f);
            ((Graphics2D)g).setStroke(stroke);

            FontMetrics fm = g.getFontMetrics();
            int h = fm.getHeight();

            //compute blue line coordonate
            fm.stringWidth(getText().substring(0,startBlue));
            int x1 = fm.stringWidth(getText().substring(0, startBlue));
            int x2 = fm.stringWidth(getText().substring(0, endBlue));
            g.setColor(Color.BLUE);
            g.drawLine(x1,0,x2,0);// draw blue line

            //compute red line coordonates
            int x3 = fm.stringWidth(getText().substring(0,startRed));
            int x4 = fm.stringWidth(getText().substring(0, endRed));
            g.setColor(Color.RED);
            g.drawLine(x3,h-1,x4,h-1); // draw redline

        }
    }
}
于 2013-02-25T13:25:43.383 に答える
1

テキストが 経由で表示される場合、テキストの上または下に線を引くJTextPaneカスタム を簡単に定義できます。HighlightPainter

次に、次を呼び出して、プログラムでテキスト ペインにハイライトを追加できます。

textPane.getHighlighter().addHighlight(startPos, endPos, 
        myLineHighlightPainter);

次の方法で、画像をペインに簡単に追加することもできます。

textPane.setIcon(myImageIcon);
于 2013-02-26T06:42:33.957 に答える
0

たとえば、svg を直接作成できます: http://xmlgraphics.apache.org/batik/これは xml ベースのベクター グラフィックス形式です。

編集: Java で svg を表示できます。Java から pdf を作成できます。Web で公開できます (単純に svg として)。

于 2013-02-21T11:05:05.213 に答える