java - 使用 Swing 设计聊天布局

标签 java swing user-interface jtextpane

我正在尝试使用 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 并再次调整大小。

在我看来,代码应该没问题,但是负首行缩进属性似乎不适用于制表位。

有人知道如何使缩进正常工作吗?

最佳答案

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

参见示例 http://java-sl.com/JEditorPaneTables.html还有这个http://java-sl.com/JEditorPaneTablesRowColumnInsert.html 您可以定义一个包含 2 列和任意多行的表格(针对每条消息)。

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

关于java - 使用 Swing 设计聊天布局,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14248825/

相关文章:

java - 用于管理用于翻译的 java lang.properties 文件的软件

java - 如何在Java Swing标签中显示X-Bar统计符号?

java - 将外部 URL 添加到 JLabel

javascript - 如何实现 gmail 风格的标签选择器?

JavaFx 将数据从一个窗口/类发送到另一个窗口/类。未接收数据

java - 在 Java 中将 SQL 解析为数组

java - 用java代码加密私钥

user-interface - 轻量级 Maven 依赖管理 GUI 工具

java - Eclipse 标记是不可见的

java - 当用户单击窗口右上角的 "x"而不是按钮时,加入超时选项。