1

スタイル付きテキストをラップされた単純なテキストに変換する必要があります(SVGワードラップ用)。ワードラップ情報(行数、改行はどこ)をから抽出できないとは信じられませんJTextArea。そこで、小さなフレームプログラムを作成しました。

package bla;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.Frame;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JTextArea;

public class Example1 extends WindowAdapter {
    private static String content = "01234567890123456789\n" + "0123456 0123456 01234567 01234567";
    JTextArea text;

    public Example1() {
        Frame f = new Frame("TextArea Example");
        f.setLayout(new BorderLayout());
        Font font = new Font("Serif", Font.ITALIC, 20);
        text = new JTextArea();
        text.setFont(font);
        text.setForeground(Color.blue);
        text.setLineWrap(true);
        text.setWrapStyleWord(true);
        f.add(text, BorderLayout.CENTER);
        text.setText(content);
        // Listen for the user to click the frame's close box
        f.addWindowListener(this);
        f.setSize(100, 511);
        f.show();
    }

    public static List<String> getLines( JTextArea text ) {
        //WHAT SHOULD I WRITE HERE
        return new ArrayList<String>();
    }

    public void windowClosing(WindowEvent evt) {
        List<String> lines = getLines(text);
        System.out.println( "Number of lines:" + lines.size());
        for (String line : lines) {
            System.out.println( line );
        }
        System.exit(0);
    }

    public static void main(String[] args) {
        Example1 instance = new Example1();
    }

}

実行すると、次のように表示されます。

表示されている画像はこちら

そして、私が出力として期待するもの:

Number of lines:6
0123456789
0123456789
0123456
0123456
01234567
01234567

コメントの代わりに何を書くべきですか?

完全な答え:

したがって、フレームを実際に表示せずに、受け入れられた回答に基づく完全なソリューション(結果から実際の改行文字を削除する必要があることに注意してください):

package bla;

import java.awt.Color;
import java.awt.Font;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JTextArea;
import javax.swing.text.BadLocationException;
import javax.swing.text.Utilities;

public class Example1 {
    private static String content = "01234567890123456789\n" + "0123456 0123456 01234567 01234567";

    public static List<String> getLines( String textContent, int width, Font font ) throws BadLocationException {
        JTextArea text;
        text = new JTextArea();
        text.setFont(font);
        text.setForeground(Color.blue);
        text.setLineWrap(true);
        text.setWrapStyleWord(true);
        text.setText(content);
        text.setSize(width, 1);
        int lastIndex = 0;
        int index = Utilities.getRowEnd(text, 0);
        List<String> result = new ArrayList<String>();
        do {
            result.add( textContent.substring( lastIndex, Math.min( index+1, textContent.length() ) ) );
            lastIndex = index + 1;
        }
        while ( lastIndex < textContent.length() && ( index = Utilities.getRowEnd(text, lastIndex) ) > 0 );
        return result;
    }

    public static void main(String[] args) throws BadLocationException {
        Font font = new Font("Serif", Font.ITALIC, 20);
        Example1 instance = new Example1();
        for (String line : getLines(content,110,font)) {
            System.out.println( line.replaceAll( "\n", "") );
        }
    }

} 

私の未解決の質問(それほど重要ではありません)、なぜjtextareaを含む100px幅のフレームは、同じ幅のフレームのないjtextareaよりも遅くテキストをラップするのですか?このためのアイデア?

4

3 に答える 3

3

JTextAreaはスタイル付きテキストをサポートしていませんが、PlainDocument以下に示すように、モデルへの行指向のアクセスをサポートしています。参考のために、

  • FrameAWT()コンポーネントとSwing( )コンポーネントを不必要に混合しないでくださいJTextArea
  • Swing GUIオブジェクトは、イベントディスパッチスレッドでのみ構築および操作する必要があります。
  • ここで説明するように、このメソッドは、折り返された行ではなく、区切られた行をgetLineCount()カウントします。line.separator
  • BasicTextUIルックアンドフィールに依存するレンダリングを処理します。メソッドviewToModel()viewToModel()2つの座標系間の変換。

コンソール:

01234567890123456789
0123456 0123456
01234567 01234567

コード:

import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.text.BadLocationException;
import javax.swing.text.PlainDocument;

public class Example2 {

    private static final Character SEP = Character.LINE_SEPARATOR;
    private static String content = ""
        + "01234567890123456789" + SEP
        + "0123456 0123456" + SEP
        + "01234567 01234567";
    private JTextArea text;

    public Example2() {
        JFrame f = new JFrame("TextArea Example");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        Font font = new Font("Serif", Font.ITALIC, 20);
        text = new JTextArea(4, 8);
        text.setFont(font);
        text.setForeground(Color.blue);
        text.setLineWrap(true);
        text.setWrapStyleWord(true);
        text.setText(content);
        f.add(new JScrollPane(text));
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
        for (String s : getLines(text)) {
            System.out.println(s);
        }
    }

    private List<String> getLines(JTextArea text) {
        PlainDocument doc = (PlainDocument) text.getDocument();
        List<String> list = new ArrayList<String>();
        for (int i = 0; i < text.getLineCount(); i++) {
            try {
                int start = text.getLineStartOffset(i);
                int length = text.getLineEndOffset(i) - start;
                list.add(doc.getText(start, length));
            } catch (BadLocationException ex) {
                ex.printStackTrace(System.err);
            }
        }
        return list;
    }

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

            @Override
            public void run() {
                Example2 instance = new Example2();
            }
        });
    }
}
于 2012-06-02T00:40:14.587 に答える
2

JTextAreaには:getLines()メソッドがありますが、それは機能しませんか?

于 2012-06-01T23:51:42.167 に答える
2

Utilities.getRowEnd()を使用します。開始オフセットとして0を渡し、次に前行の終了オフセット+1を渡します。

于 2012-06-02T15:06:21.807 に答える