0

我是 java 新手,正在研究 java swing GUI。最近看了一篇文章: Centering Text in a JTextArea or JTextPane - Horizo​​ntal Text Alignment

里面的解决方案效果很好,但我有一些概念性的问题要问。

我在oracle网站上阅读了接口和类的介绍。它表示接口包含一组空体方法,那么实现该接口的类需要声明接口中提到的所有方法才能成功编译。

我的问题来了:看完文档,我知道StyledDocument是一个接口,但是下面的代码是什么意思呢?

StyledDocument doc = textPane.getStyledDocument();

我的解释是,我猜一个 JTextPane 在内部实现了 StyledDocument 以便这行代码接收现有的 StyledDocument (但它不应该被称为实例,因为我们无法创建接口实例,我应该如何描述它? ) . 如果这是真的,那么 JTextPane 应该在 StyledDocument 接口中定义所有方法。

我在上面的段落中正确吗?

然后,我尽量不写这两行代码:

StyledDocument doc = textPane.getStyledDocument();
doc.setParagraphAttributes(0, doc.getLength(), center, false);

但是我直接用了:

textPane.setParagraphAttributes(center, false);

这也很有效。

那么,这两种实现之间有什么区别吗?

我的代码是这样做的好习惯吗?

非常感谢您的帮助!

4

1 回答 1

1

我认为您陷入了多态性的概念,请先看看多态性的线索。

我的解释是,我猜一个 JTextPane 在内部实现了 StyledDocument 以便这行代码接收现有的 StyledDocument (但它不应该被称为实例,因为我们无法创建接口实例,我应该如何描述它? )。如果这是真的,那么 JTextPane 应该在 StyledDocument 接口中定义所有方法。

不,该getStyledDocument方法返回一个实现 StyledDocument接口的对象。 JTextPane不直接实现此功能,而是将需求委托给实现StyledDocument接口的对象实例。

它们一起提供了显示样式文本的方法。这是模型-视图-控制器范式的概念,其中非可视功能(模型或StyledDocument)与视图(JTextPane)分离

然后,我尽量不写这两行代码:

StyledDocument doc = textPane.getStyledDocument();
doc.setParagraphAttributes(0, doc.getLength(), center, false);

但是我直接用了:

textPane.setParagraphAttributes(center, false);

这也很有效。

那么,这两种实现之间有什么区别吗?

是和不是。 setParagraphAttributes将功能委托给StyledDocument,如下面的代码片段,取自JTextPane演示:

public void setParagraphAttributes(AttributeSet attr, boolean replace) {
    int p0 = getSelectionStart();
    int p1 = getSelectionEnd();
    StyledDocument doc = getStyledDocument();
    doc.setParagraphAttributes(p0, p1 - p0, attr, replace);
}

它只是作为一种方便的方法,让你的生活更简单一些

我的代码是这样做的好习惯吗?

我认为使用提供的功能来实现您的目标没有问题。

于 2015-08-05T04:37:47.200 回答