我是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);
}
它只是作为一种便捷的方法,使您的生活更简单
我的代码是这样做的好习惯吗?
我认为使用提供的功能来实现目标没有问题。