簡體   English   中英

如何在JTextPane上設置固定寬度但動態高度?

[英]How to set fixed width but dynamic height on JTextPane?

我想使用具有固定寬度但動態高度的JTextpane ,它也應該允許換行。 高度應隨用戶添加或刪除文本而變化。 我本來會使用JTextArea但是文本的樣式必須不同。 是否有解決此問題的簡便方法?

我已經寫了類似答案。 在這里檢查。

您必須了解JTextPane返回的preferredSize是:

  • 如果未設置width,則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);
            }
        });
    }
}

使用不帶水平滾動的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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM