3

我想在同一行对齐两段文本:第一段应对齐到左侧,另一段应对齐到 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);

它给出了类似的输出

命名时间他的

但我想要这样的输出

命名                                                     时间他的

(在同一行的 JTextpane 中正好相反)

我的代码有什么问题吗?我怎么解决这个问题?

4

1 回答 1

4

我认为您不能为同一行设置两种不同的对齐方式(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方法完全按照它所说的去做——关键是对齐是一个段落属性——打开 OO Writer 或 MS Word(pad),写一些文本并对齐它——它会更清晰。

当我想在 MS Word/OO Writer 中实现该对齐时,我制作了一个带有不可见边框的表格,并将左列设置为左对齐,将右列设置为右对齐。这将得出结论,我们需要实现StyledDocument 接口的 HTMLDocument(因为您可以在 HTML 中制作表格)类。所以我尝试了这个:

JTextPane pane = new JTextPane(new HTMLDocument());

这导致没有风格。这是有道理的,因为层叠样式表是设置 HTML 样式的正确方法。这个构造函数也解释了它:

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)

所以,基本上它是一个文本组件文本内容的可编程编辑器(通过读写方法),即Document

Document 是一个文本容器,用作摆动文本组件的模型。此接口的目标是从非常简单的需求(纯文本文本字段)扩展到复杂的需求(例如 HTML 或 XML 文档)。

因此,HTMLEditorKit是文本组件的HTML 文本内容的可编程编辑器,即HTMLDocument - 仔细看看这个类的继承链和实现接口 - 你会在整个答案中注意到几乎所有这些。

现在,这是来自 HTMLEditorKit apidoc 的神奇部分:

尽管 Document 默认提供 HTML 支持,但没有什么可以阻止对非 HTML 标记的支持,这些标记会导致替代元素结构。

所以看起来这个类的默认实现就像我们想要的那样将我们的样式属性转换为 HTML/CSS:在同一行中左对齐和右对齐。

这是有道理的,因为使用 HTML/CSS,您至少可以通过两种方式做到这一点:

  • 制作一个两列表并分别设置它们的对齐方式
  • 制作两个浮动 div 并分别设置它们的对齐方式

并且很可能有更多方法可以做到这一点。

于 2012-10-25T14:02:50.200 回答