【发布时间】:2016-09-13 17:30:56
【问题描述】:
我想使用宽度固定但高度动态的JTextpane,它也应该允许换行。高度应该随着用户添加或删除文本而改变。我会使用JTextArea,但文本的样式必须不同。有没有简单的方法来解决这个问题?
【问题讨论】:
-
你有没有尝试做点什么?
我想使用宽度固定但高度动态的JTextpane,它也应该允许换行。高度应该随着用户添加或删除文本而改变。我会使用JTextArea,但文本的样式必须不同。有没有简单的方法来解决这个问题?
【问题讨论】:
我已经为类似的事情写了一个答案。检查here。
你要明白JTextPane返回的preferredSize是:
为什么会有这种行为?
这很简单。如果您不知道可以使用的宽度,则无法计算表示文本所需的高度。
如何动态实现?
最好将 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);
}
});
}
}
【讨论】:
使用没有水平滚动的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
【讨论】: