我想使用一个固定宽度但动态高度的JTextpane
,并允许换行。在用户添加或删除文本时,高度应该随之改变。JTextArea
不能满足我的需求,因为文本需要以不同的样式呈现。有没有简单的方法解决这个问题?
如果没有设置宽度,则getPreferredSize返回Dimension(width,height),其中width
是不换行时最长一行的宽度,而height
是在无限宽度的面板中显示所有行所需的高度。
如果设置了宽度,则getPrefferedSize返回Dimension(width,height),其中width
是在当前宽度下文本换行后最长一行的宽度,height
是显示整个文本所需的高度。
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);
JTextArea
而非JTextPane
。