我想在同一行上对齐两段文本:第一部分应与左侧对齐,另一部分应与java swing JTextPane的右侧对齐。我尝试使用样式界面和Styleconstants类来对齐文本,但它不起作用。但是当我在同一文本上应用其他一些样式,例如 Styleconstants.setFontSize(),Styleconstants.setForeGroundColor()时,它工作正常。
这是我的代码:
JTextPane pane = new JTextPane();
StyledDocument sdoc = pane.getStyledDocument();
SimpleAttributeSet rightAlign = new SimpleAttributeSet();
StyleConstants.setAlignment(rightAlign, StyleConstants.ALIGN_RIGHT);
StyleConstants.setForeground(rightAlign, Color.lightGray);
StyleConstants.setFontSize(rightAlign, 11);
sdoc.insertString(sdoc.getLength(), "name", null);
sdoc.insertString(sdoc.getLength(), "timeHis" + "\n", rightAlign);
它提供类似
的输出nametimeHis
但我想要像这样输出
命名的 timeHis
(在同一行的JTextpane中完全相反)
我的代码有什么问题吗?我该如何解决这个问题?
答案 0 :(得分:3)
我认为你不能为相同行设置两个不同的路线(即使在专业文本编辑器中你也不能这样做AFAIK - 只是通过设置对齐)。我重写了你的代码:
SimpleAttributeSet rightAlign = new SimpleAttributeSet();
SimpleAttributeSet leftAlign = new SimpleAttributeSet();
StyleConstants.setAlignment(rightAlign, StyleConstants.ALIGN_RIGHT);
StyleConstants.setForeground(rightAlign, Color.lightGray);
StyleConstants.setFontSize(rightAlign, 11);
StyleConstants.setAlignment(leftAlign, StyleConstants.ALIGN_LEFT);
StyleConstants.setForeground(leftAlign, Color.black);
StyleConstants.setFontSize(leftAlign, 13);
String left = "name";
String right = "timeHis\n";
sdoc.insertString(0, left, leftAlign);
sdoc.insertString(left.length(), right, rightAlign);
sdoc.setParagraphAttributes(0, left.length(), leftAlign, false);
sdoc.setParagraphAttributes(left.length()+1, sdoc.getLength()-1-left.length(), rightAlign, false);
尺寸和颜色都可以,但两个字符串的对齐方式都是正确的。如果您在最后两行中交换对齐方式,如下所示:
sdoc.setParagraphAttributes(0, left.length(), rightAlign, false);
sdoc.setParagraphAttributes(left.length()+1, sdoc.getLength()-1-left.length(),leftAlign, false);
两者都将左对齐,但如果在左侧字符串中添加新行:
String left = "name\n";
对齐也变得很荣幸。 setParagraphAttributes方法正如它所说的那样 - 关键是对齐是paragraph属性 - 打开OO Writer或MS Word(pad),写一些文本并对齐它 - 它会更清晰。< / p>
当我想在MS Word / OO Writer中实现该对齐时,我创建一个具有不可见边框的表,并将左列设置为左对齐,将右列设置为右对齐。 这将导致我们需要HTMLDocument(因为您可以在HTML中创建table)类来实现StyledDocument interface。所以我尝试了这个:
JTextPane pane = new JTextPane(new HTMLDocument());
导致没有风格。这是有道理的,因为Cascading Style Sheets是设置HTML样式的正确方法。这个constructor也解释了它:
public HTMLDocument(StyleSheet styles)
这是StyleSheet构造函数参数的链接。
但是,这可以解决问题:
JTextPane pane = new JTextPane();
pane.setEditorKit(new HTMLEditorKit());
将文本组件所需的一组内容建立为某种类型的文本内容的合理功能编辑器。 EditorKit充当某种策略的工厂。例如,可以提供可以与其他实现替换的html和rtf的实现。
一些EditorKit方法是:
createCaret()
getContentType()
read(Reader in, Document doc, int pos)
write(Writer out, Document doc, int pos, int len)
所以,基本上它是text component的文本内容的可编程编辑器(通过读写方法),即Document:
Document是文本的容器,用作swing文本组件的模型。此接口的目标是从非常简单的需求(纯文本文本字段)扩展到复杂需求(例如,HTML或XML文档)。
因此,HTMLEditorKit是文本组件的 HTML文本内容的可编程编辑器,即HTMLDocument - 仔细查看此类的继承链和实现接口 - 在这个答案中你几乎都会注意到它们。
现在,这是来自HTMLEditorKit apidoc的神奇部分:
虽然默认情况下Document支持HTML,但没有什么能阻止非HTML标签支持导致替代元素结构。
所以看起来这个类的默认实现只是按照我们想要的方式将style attributes转换为HTML / CSS:左右对齐在同一行。
这是有道理的,因为使用HTML / CSS,您至少可以通过两种方式实现:
并且很可能有更多方法可以做到。