我正在尝试使用Swing设计一个聊天用户界面,但我太笨了,无法弄清楚如何对邮件部分进行适当的缩进。
以下是我所追求的一个例子:
这就是我刚刚攻击的内容(只需复制并粘贴):
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。
任何人都有想法如何使缩进正常工作?
答案 0 :(得分:3)
我会推荐另一种方法 - 基于表格。
请参阅示例http://java-sl.com/JEditorPaneTables.html和此http://java-sl.com/JEditorPaneTablesRowColumnInsert.html 您可以根据需要定义一个包含2列和多行的表(对于每条消息)。
第一个单元格包含昵称,第二个单元格包含消息。您可以根据需要对齐单元格的内容(实际上是正常段落)。您还可以为列/行定义要呈现的任何所需边框。