我是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);
这也很有效。
那么,这两种实现之间有什么区别吗?
我的代码是一个很好的做法吗?
非常感谢您的帮助!
答案 0 :(得分:1)
我认为你已经陷入了多态性的概念,看看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);
}
它只是作为一种方便的方法,让你的生活更简单
我的代码是一个很好的做法吗?
我发现使用为实现目标而提供的功能没有任何问题。