如何将JTextPane的大小修改为其内容?

时间:2014-08-07 11:58:20

标签: java swing jtextpane

JPanel BoxLayout

panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS){
        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        @Override
        public Dimension minimumLayoutSize(Container target){
            return new Dimension(100, 25);
        }
        @Override
        public Dimension maximumLayoutSize(Container target){
            return new Dimension(100,25);
        }

});

我动态添加了一些JTextPaneJPanel。 我调用下面的方法将新JTextPane添加到我的jpanel并将文本传递给它。

public void display(final String text){
    StyleContext sc = new StyleContext();
    final DefaultStyledDocument doc = new DefaultStyledDocument(sc);
    Style defaultStyle = sc.getStyle(StyleContext.DEFAULT_STYLE);
    final Style style = sc.addStyle("MainStyle", defaultStyle);
    JTextPane pane = new JTextPane(){
        /**
         * 
         */
        private static final long serialVersionUID = 1L;

        @Override // how should I write this:
        public Dimension getMinimumSize(){
            return new Dimension(text.length()*5, getContentHeight(text.length()*5,text));
        }
        @Override // how should I write this:
        public Dimension  getMaximumSize(){
            return  new Dimension(430, getContentHeight(text.length()*5,text));
        }
    };
    receive.setStyledDocument(doc);
    receive.setEditable(false);
    // how should I write this: 
    receive.setPreferredSize(new Dimension(text.length()*5, getContentHeight(text.length()*5,text)));

    try {
        doc.insertString(doc.getLength(),text,style);
    } catch (BadLocationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    panel.add(pane);

}

因此内容不会改变。

public int getContentHeight(int i, String content) {
        JEditorPane dummyEditorPane=new JEditorPane();
        dummyEditorPane.setSize(i,Short.MAX_VALUE);
        dummyEditorPane.setText(content);
        return dummyEditorPane.getPreferredSize().height;
}

问题出在getMinimumSize()以及getMaximumSize()setPreferredSize()方法中! 也是我为dummyEditorPane.setSize(i,Short.MAX_VALUE);设置的宽度 那么如何设置此方法来修复textpane的大小?

2 个答案:

答案 0 :(得分:0)

使用setPreferredSize,但也许您可能会受益于JScrollPane的正常使用:

panel.add(new JScrollPane(pane));

JTextPane将适应其文档大小,并且JScrollPane会在需要时进一步关注滚动条。

答案 1 :(得分:0)

getPreferredSize()已经返回了内容的大小。所以解决方案就是不使用setPreferredSize,而是使用

jtp.setSize(jtp.getWidth(),jtp.getPreferredSize().height);//For fixed width

jtp.setSize(jtp.getPreferredSize());//for unlimited width and no wrapping

这将设置JTextPane的高度以匹配其内容。

要使用BoxLayout执行此操作,您可能需要

  • 扩展您的JTextPane并覆盖getMinimumSizegetMaximumSize以使其返回getPreferredSize

            final JTextPane myJTP = new JTextPane() {
    
                @Override
                public Dimension getMinimumSize() {
                    return getPreferredSize();
                }
    
                @Override
                public Dimension getMaximumSize() {
                    return getPreferredSize();
                }
    
            };
    
  • 或扩展BoxLayout以使layoutContainer方法为其子项设置正确的大小。