JEdi​​torPane,是首选大小跟踪父宽度?

时间:2011-11-20 18:48:30

标签: java swing layout jtextpane jeditorpane

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

1 个答案:

答案 0 :(得分:0)

我建议您将组件添加到JFrame的内容窗格中,而不是使用add()方法。还要在内容窗格上设置布局,它将自动调整大小。

JFrame f = new JFrame();
f.getContentPane().setLayout(new BorderLayout());
f.getContentPane().add(new JTextPane());

此致