我是Java的新手,正在使用Java swing GUI。
最近我读了一篇文章:
Centering Text in a JTextArea or JTextPane - Horizontal 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);


这也完美地工作了。

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

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

非常感谢您的帮助!

最佳答案

我认为您会陷入多态性的概念,请阅读Polymorphism入门指南。


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


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

它们一起提供了显示样式化文本的方式。这是Model-View-Controller范式的概念,其中非可视功能(模型或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);
}


它只是作为一种便捷的方法,使您的生活更简单


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


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

09-18 01:20