【问题标题】:How to set fixed width but dynamic height on JTextPane?如何在 JTextPane 上设置固定宽度但动态高度?
【发布时间】:2016-09-13 17:30:56
【问题描述】:

我想使用宽度固定但高度动态的JTextpane,它也应该允许换行。高度应该随着用户添加或删除文本而改变。我会使用JTextArea,但文本的样式必须不同。有没有简单的方法来解决这个问题?

【问题讨论】:

  • 你有没有尝试做点什么?

标签: java jtextpane


【解决方案1】:

我已经为类似的事情写了一个答案。检查here

你要明白JTextPane返回的preferredSize是:

    1234563窗格中无限宽的线条。 1234563以当前宽度换行的文本。

为什么会有这种行为?

这很简单。如果您不知道可以使用的宽度,则无法计算表示文本所需的高度。

如何动态实现?

最好将 DocumentListener 添加到您的 JTextPane 的文档中。然后,在每次更改时,只需调用

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);
            }
        });
    }
}

【讨论】:

  • 欢迎您。得到满意的答案后,请按左侧的勾号将其选中。
  • @mweetwa,如果你是 StackOverflow 的新手,请阅读 this ;)
【解决方案2】:

使用没有水平滚动的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.html , http://java-sl.com/tip_html_letter_wrap.html

我会建议使用JTextArea 而不是JTextPane

【讨论】:

    猜你喜欢
    • 2021-02-27
    • 1970-01-01
    • 1970-01-01
    • 2018-03-20
    • 2015-07-24
    • 2013-01-15
    • 1970-01-01
    • 2016-06-01
    • 2014-03-19
    相关资源
    最近更新 更多