3

テキストの2つのセクションを同じ行に揃えたい:最初のセクションは左側に揃え、もう一方のセクションはJavaSwingJTextPaneの右側に揃える必要があります。スタイルインターフェイスとStyleconstantsクラスを使用してテキストを揃えようとしましたが、機能しませんでした。しかし、Styleconstants.setFontSize()、Styleconstants.setForeGroundColor()などの他のスタイルを同じテキストに適用すると、正常に機能します。

これが私のコードです:

JTextPane pane = new JTextPane();
StyledDocument sdoc = pane.getStyledDocument();
SimpleAttributeSet rightAlign = new SimpleAttributeSet();
StyleConstants.setAlignment(rightAlign, StyleConstants.ALIGN_RIGHT);
StyleConstants.setForeground(rightAlign, Color.lightGray);
StyleConstants.setFontSize(rightAlign, 11);
sdoc.insertString(sdoc.getLength(), "name", null);
sdoc.insertString(sdoc.getLength(), "timeHis" + "\n", rightAlign);

それは次のような出力を与えます

nametimeHis

でもこんな出力が欲しい

名前                                                     timeHis

(同じ行のJTextpaneの正反対側)

私のコードに何か問題がありますか?どうすればこの問題を解決できますか?

4

1 に答える 1

4

同じ行に2つの異なる配置を設定できるとは思いません(私の知る限り、プロのテキストエディターでも配置を設定するだけではできません)。私はあなたのコードを次のように書き直しました:

    SimpleAttributeSet rightAlign = new SimpleAttributeSet();
    SimpleAttributeSet leftAlign = new SimpleAttributeSet();

    StyleConstants.setAlignment(rightAlign, StyleConstants.ALIGN_RIGHT);
    StyleConstants.setForeground(rightAlign, Color.lightGray);
    StyleConstants.setFontSize(rightAlign, 11);

    StyleConstants.setAlignment(leftAlign, StyleConstants.ALIGN_LEFT);
    StyleConstants.setForeground(leftAlign, Color.black);
    StyleConstants.setFontSize(leftAlign, 13);

    String left = "name";
    String right = "timeHis\n";

    sdoc.insertString(0, left, leftAlign);
    sdoc.insertString(left.length(), right, rightAlign);

    sdoc.setParagraphAttributes(0, left.length(), leftAlign, false);               
    sdoc.setParagraphAttributes(left.length()+1, sdoc.getLength()-1-left.length(), rightAlign, false);      

サイズと色はOKですが、両方の弦の位置合わせは正しいです. 次のように最後の 2 行でアラインメントを入れ替えると:

    sdoc.setParagraphAttributes(0, left.length(),  rightAlign, false);               
    sdoc.setParagraphAttributes(left.length()+1, sdoc.getLength()-1-left.length(),leftAlign, false);  

両方とも左揃えになりますが、左の文字列に新しい行を追加すると:

String left = "name\n";

アライメントも尊重されます。setParagraphAttributesメソッドは、それが言うことを正確に実行します-ポイントは、配置が段落属性であるということです-OO WriterまたはMS Word(パッド)を開き、テキストを書き込んで配置します-より明確になります。

MS Word/OO Writer でその配置を実現したいときは、境界線が見えないテーブルを作成し、左の列を左揃えに、右の列を右揃えに設定します。これは、 StyledDocument インターフェイスを実装する HTMLDocument クラス (HTMLでテーブルを作成できるため) が必要であるという結論につながります。だから私はこれを試しました:

JTextPane pane = new JTextPane(new HTMLDocument());

その結果、スタイルがなくなります。Cascading Style Sheetsは HTML のスタイルを設定する適切な方法であるため、これは理にかなっています。このコンストラクターは、次のようにも説明しています。

public HTMLDocument(StyleSheet styles)

StyleSheetコンストラクター引数へのリンクを次に示します。

しかし、これはトリックを行います:

JTextPane pane = new JTextPane();
pane.setEditorKit(new HTMLEditorKit());

EditorKit : _

テキスト コンポーネントが、ある種のテキスト コンテンツに対して適切に機能するエディタになるために必要なもののセットを確立します。EditorKit は、ある種のポリシーのファクトリとして機能します。たとえば、他の実装に置き換え可能な html および rtf の実装を提供できます。

いくつかの EditorKit メソッドは次のとおりです。

  • createCaret()
  • getContentType()
  • read(Reader in, Document doc, int pos)
  • write(Writer out, Document doc, int pos, int len)

したがって、基本的には、テキスト コンポーネントテキスト コンテンツ、つまりDocumentに対する (読み取りおよび書き込みメソッドによる) プログラム可能なエディターです。

Document は、swing テキスト コンポーネントのモデルとして機能するテキストのコンテナーです。このインターフェイスの目標は、非常に単純なニーズ (プレーン テキスト テキスト フィールド) から複雑なニーズ (HTML または XML ドキュメントなど) に拡張することです。

したがって、 HTMLEditorKitは、テキスト コンポーネントのHTML テキスト コンテンツ、つまりHTMLDocumentのプログラム可能なエディターですこのクラスの継承チェーンと実装インターフェイスをよく見てください。この回答全体で、それらのほとんどすべてに気付くでしょう。

さて、これは HTMLEditorKit apidoc の魔法の部分です:

Document はデフォルトで HTML サポートを提供しますが、代わりの要素構造をもたらす HTML 以外のタグのサポートを妨げるものは何もありません。

したがって、このクラスのデフォルトの実装は、スタイル属性を希望どおりに HTML/CSS に変換したように見えます: 同じ行で左揃えと右揃えです。

HTML/CSS を使用すると、少なくとも 2 つの方法でそれを行うことができるため、これは理にかなっています。

  • 2列のテーブルを作成し、それぞれの配置を設定する
  • 2 つのフローティング div を作成し、それぞれの配置を設定する

おそらくもっと多くの方法があります。

于 2012-10-25T14:02:50.200 に答える