使用Swing设计聊天布局

时间:2013-01-10 00:19:42

标签: java swing user-interface jtextpane

我正在尝试使用Swing设计一个聊天用户界面,但我太笨了,无法弄清楚如何对邮件部分进行适当的缩进。

以下是我所追求的一个例子: 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并再次调整大小。

在我看来,代码应该没问题,但是负的第一行缩进属性似乎不适用于tabstops。

任何人都有想法如何使缩进正常工作?

1 个答案:

答案 0 :(得分:3)

我会推荐另一种方法 - 基于表格。

请参阅示例http://java-sl.com/JEditorPaneTables.html和此http://java-sl.com/JEditorPaneTablesRowColumnInsert.html 您可以根据需要定义一个包含2列和多行的表(对于每条消息)。

第一个单元格包含昵称,第二个单元格包含消息。您可以根据需要对齐单元格的内容(实际上是正常段落)。您还可以为列/行定义要呈现的任何所需边框。