1

Swingを使用してチャットUIを設計しようとしていますが、メッセージ部分を適切にインデントする方法を理解するにはあまりにも愚かです。

これが私が求めているものの例です: http://xchat.org/docs/start/xchat-3-channel.png

これが私が一緒にハックしたものです(コピーして貼り付けるだけです):

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

public class Scrap {

private static final int NICK_INDENT = 120;
private static final int MESSAGE_INDENT = NICK_INDENT + 10;

private static boolean applyHangingIndent = false;

public static void main(final String args[]) {
    StyledDocument doc = new DefaultStyledDocument();
    JTextPane pane = new JTextPane(doc) {
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            g.setColor(Color.BLACK);
            g.drawLine(NICK_INDENT + 5, 0, NICK_INDENT + 5, getHeight());
        }
    };

    TabStop[] tabs = new TabStop[2];
    tabs[0] = new TabStop(NICK_INDENT, TabStop.ALIGN_RIGHT, TabStop.LEAD_NONE);
    tabs[1] = new TabStop(MESSAGE_INDENT, TabStop.ALIGN_LEFT, TabStop.LEAD_NONE);
    TabSet tabset = new TabSet(tabs);

    StyleContext sc = StyleContext.getDefaultStyleContext();
    AttributeSet aset = sc.addAttribute(SimpleAttributeSet.EMPTY, StyleConstants.TabSet, tabset);
    pane.setParagraphAttributes(aset, false);

    insertString(doc, "\ta nickname:\tthis is the message blaa blaa blaa\n");

    if (applyHangingIndent) {
        applyHangingIndent(doc);
    }

    insertString(doc, "\tanother nickname:\there is another message blaa blaa blaablaa, try to resize the window\n");

    if (applyHangingIndent) {
        applyHangingIndent(doc);
    }

    insertString(doc, "\ta third nickname:\tnow try to set the applyHangingIndent to true!\n");

    if (applyHangingIndent) {
        applyHangingIndent(doc);
    }

    JFrame frame = new JFrame();
    frame.setContentPane(new JScrollPane(pane));
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.setSize(600, 300);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

private static void insertString(StyledDocument doc, String str) {
    try {
        doc.insertString(doc.getLength(), str, null);
    } catch (BadLocationException e) {
        e.printStackTrace();
    }
}

private static void applyHangingIndent(StyledDocument doc) {
    SimpleAttributeSet sas = new SimpleAttributeSet();
    int indent = MESSAGE_INDENT;
    StyleConstants.setFirstLineIndent(sas, -indent);
    StyleConstants.setLeftIndent(sas, indent);
    doc.setParagraphAttributes(0, doc.getLength(), sas, false);
}
}

ウィンドウのサイズを小さくしてみてください。

ここで、applyHangingIndentをtrueに設定して、サイズを変更してみてください。

私の考えでは、コードは問題ないはずですが、最初の行の負のインデントプロパティはタブストップでは機能しないようです。

インデントを正しく機能させる方法を知っている人はいますか?

4

1 に答える 1

3

別のアプローチをお勧めします-テーブルベース。

http://java-sl.com/JEditorPaneTables.htmlおよびこのhttp://java-sl.com/JEditorPaneTablesRowColumnInsert.htmlを参照してください 。2列および必要な数の行(メッセージごとに)を持つテーブルを定義できます。 )。

最初のセルにはニックネームが含まれ、2番目のセルにはメッセージが含まれます。必要に応じて、セルの内容(実際には通常の段落)を揃えることができます。また、列/行にレンダリングする、またはレンダリングしない任意の境界線を定義できます。

于 2013-01-10T06:00:13.593 に答える