关于StyledDocument和JTextPane的关系,接口的正确使用问题

Questions about relationship between StyledDocument and JTextPane, and the proper usage of interface

我是 java 的新手,正在研究 java swing GUI。 最近看了一篇post: Centering Text in a JTextArea or JTextPane - Horizontal Text Alignment

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

看了oracle网站上的interface和classes的介绍。它说接口包含一组空方法,那么实现该接口的class需要声明接口中提到的所有方法才能成功编译。

我的问题来了: 看了文档才知道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);

这也很完美。

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

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

非常感谢您的帮助!

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

My interpretation is that, I guess that a JTextPane implements the StyledDocument internally so that this line of code is to receive the existing StyledDocument (But it should not be called an instance as we could not create instance of interface, How should I describe it?). If this is true, then JTextPane should have all methods defined in the StyledDocument interface.

没有。 getStyledDocument 方法 returns 一个实现 StyledDocument 接口的对象。 JTextPane 不直接实现此功能,而是将要求委托给实现 StyledDocument 接口的对象实例。

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

Then, I tried not to write this two lines of code:

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

But I directly used:

textPane.setParagraphAttributes(center, false);

And this also worked perfectly.

So, are there any differences between the two implementations?

是也不是。 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);
}

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

Is my code a good practice to do so?

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