gpt4 book ai didi

java - 使用 Swing 设计聊天布局

转载 作者:行者123 更新时间:2023-11-29 05:50:04 26 4
gpt4 key购买 nike

我正在尝试使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com