如何在JTextPane上设置固定宽度但动态高度?

5

我想使用一个固定宽度但动态高度的JTextpane,并允许换行。在用户添加或删除文本时,高度应该随之改变。JTextArea不能满足我的需求,因为文本需要以不同的样式呈现。有没有简单的方法解决这个问题?


2
你尝试过做些什么吗? - Youcef LAIDANI
2个回答

4
我已经为类似问题写了一个答案。请查看这里
您需要了解JTextPane返回的preferredSize是:
  • 如果没有设置宽度,则getPreferredSize返回Dimension(width,height),其中width是不换行时最长一行的宽度,而height是在无限宽度的面板中显示所有行所需的高度。

  • 如果设置了宽度,则getPrefferedSize返回Dimension(width,height),其中width是在当前宽度下文本换行后最长一行的宽度,height是显示整个文本所需的高度。

为什么会出现这种情况? 这很简单。如果您不知道可以使用的宽度,则无法计算表示文本所需的高度。 如何进行动态处理? 最好的方法是向JTextPane的Document添加DocumentListener。然后,在每次更改时调用:
myJTextPane.setSize(myJTextPane.getWidth(),myJtextPane.getPreferredSize().height);

举个例子

玩转这段代码:

import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;

public class HelloWorld {

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                final JFrame mainFrame = new JFrame("test");
                mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                final JTextPane field = new JTextPane();
                field.setText("Lorem ipsum dolor sit amet, consectetur adipiscing elit. Suspendisse accumsan magna vel libero bibendum, quis hendrerit nisi rutrum. Cras placerat erat eget dictum ornare. Sed eget nisl quis nibh vehicula mollis. Vestibulum non iaculis erat, quis pulvinar magna. Suspendisse ac rhoncus purus. Quisque finibus, dolor varius tincidunt aliquet, mauris felis condimentum neque, at viverra felis nulla at justo. Duis ut dui velit. Integer vitae mollis leo. Cras quis urna odio. Suspendisse tempus, urna sed maximus fringilla, ante velit finibus massa, id commodo libero quam non ipsum. Sed id augue vitae sapien sagittis imperdiet in eget nibh. Nam semper posuere nisl, dictum efficitur ipsum aliquet ac. Phasellus eros massa, fringilla et neque maximus, pretium tempor magna.");

                mainFrame.getContentPane().setLayout(null);
                mainFrame.getContentPane().add(field,BorderLayout.CENTER);
                field.setLocation(0, 0);
                field.setSize(200,40);
                field.setSize(200, field.getPreferredSize().height);
                mainFrame.setSize(300,500);
                mainFrame.setVisible(true);
                System.out.println(field.getPreferredSize().width+" , "+field.getPreferredSize().height);
            }
        });
    }
}

欢迎。一旦您得到满意的答案,请按左侧的勾选它。 - Sharcoux
@mweetwa,如果您是StackOverflow的新手,请阅读这篇文章 ;) - Sharcoux

3

使用没有水平滚动条的 JScrollPane

JFrame frame = new JFrame();    
JPanel pnel = new JPanel(); 
frame.setContentPane(pnel); 
JTextPane txtpane = new JTextPane();    
txtpane.setPreferredSize(new Dimension(200, 200));
JScrollPane jsp = new JScrollPane(txtpane,JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
        JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
pnel.add(jsp);  
frame.pack();
frame.setVisible(true);

这不会自动换行。若要自动换行,请参考以下链接:http://java-sl.com/wrap.htmlhttp://java-sl.com/tip_html_letter_wrap.html 建议使用JTextArea而非JTextPane

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接