JEditorPane
似乎有一个非常有趣的功能:它似乎跟踪其父级宽度,并相应地确定首选高度,如果父级不是JViewport
。
按轨道我的意思是组件的首选宽度设置为其父级之一(可能除了一些插入)。
ScrollableTracksViewportWidth
为假。
这是演示这一事实的非常简单的代码(只需复制和修复导入):
调整JFrame
的大小后,JEditorPane
(在我的环境中)的首选宽度始终为frame.width-14
(当然,14可能是特定于图形系统的。)
q1)跟踪父(非视口)宽度是好的。我可以依靠它吗?据我所知,这是一个没有文档记录的功能。更多!只需将new JEditorPane()
替换为new JTextPane()
,JEditorPane
的更丰富的子类,该功能就会消失。
q2)在我看来,这种“跟踪”是通过JEditorPane
大小的“设置”发生的。这意味着必须首先设置尺寸(宽度),然后首选尺寸高度就可以了。这样对吗?
q3)为什么JTextPane
没有此功能?
public class SSCE01 extends JFrame {
public static void main(String[] a) {
new SSCE01().setVisible(true);
}
public SSCE01() {
final JEditorPane ep = new JEditorPane();
add(ep);
addComponentListener(new ComponentAdapter() {
public void componentResized(ComponentEvent e) {
Dimension ps = getSize();
System.out.println("Frame size : " + ps.width + " x " + ps.height);
ps = ep.getPreferredSize();
System.out.println("JEditorPane preferredSize: " + ps.width + " x " + ps.height);
}
});
pack();
}
}
q4)更明确的问题。如在q2中假设的那样,设置大小允许跟踪。但仅限于JEditorPane,不适用于JTextPane。我怎样才能为JTextPane完成此操作?
这有效:
public SSCE02() {
JEditorPane ep = new JEditorPane();
ep.setText("this is a very very long text. veeeeery long, so long that it will never fit into one 100 pixels width row");
ep.setSize(new Dimension(100,Integer.MAX_VALUE));
add(ep);
pack();
}
这不是。已使用JTextPane
代替JEditorPane
:
public SSCE02() {
JEditorPane ep = new JTextPane();
ep.setText("this is a very very long text. veeeeery long, so long that it will never fit into one 100 pixels width row");
ep.setSize(new Dimension(100,Integer.MAX_VALUE));
add(ep);
pack();
}
更新1
总结:在JEditorPane中观察到“track Size属性”,但JTextPane中没有类似的东西。
稍微但有意义的一步:
将HTML文档加载到JEditorPane中也可以使该功能从JEditorPane中消失
此时,该功能似乎由Document实现实现,而不是由JEditorPane(或JTextPane)本身实现!对于JEditorPane,文档为javax.swing.text.PlainDocument
。当你这样做时:
URL url = HTMLInComponents01.class.getResource("sample.html");
jEditorPane1.setPage(url);
System.out.println(jEditorPane1.getDocument().getClass().getName());
你会得到:
javax.swing.text.html.HTMLDocument
我还注意到,当通过setSize给出宽度时,给我们提供“计算组件高度”的优质服务的好javax.swing.text.PlainDocument
不能分配给需要StyledDocument实例的JTextPane。 !
现在我将验证哪些其他文本组件能够使用PlainDocument
。
答案 0 :(得分:0)
我建议您将组件添加到JFrame的内容窗格中,而不是使用add()方法。还要在内容窗格上设置布局,它将自动调整大小。
JFrame f = new JFrame();
f.getContentPane().setLayout(new BorderLayout());
f.getContentPane().add(new JTextPane());
此致