簡體   English   中英

如何創建具有指定寬度的JTextArea以及顯示所有文本所需的最小高度?

[英]How can I create a JTextArea with a specified width and the smallest possible height required to display all the text?

在我可以找到的所有使用JTextArea的示例中,在構造JTextArea之前已知高度和寬度,如果JTextArea需要更多高度,則將其放在JScrollPane 顯然, JTextArea的高度取決於寬度和文本內容。

現在,我的情況要求我不使用JScrollPane ,而是讓JTextArea足夠高以顯示所有文本。 當我創建JTextArea ,我知道文本內容以及它將使用多少寬度; 我不知道高度 - 我希望在不切斷任何文本的情況下盡可能小。 這似乎很難實現。

作為旁注, JTextArea將添加到沒有布局管理器的JPanel中 - 它使用基於添加的組件的首選大小的絕對定位。 這要求我的JTextArea將在getPreferredSize()上返回正確的維度。 正確的尺寸應該是我構造時提供的寬度,以及顯示所提供寬度的所有文本所需的最小高度。

我發現了一些類似的線程,討論了JTextArea所涉及的奇怪/錯誤,有時通過在父容器上調用pack()兩次來解決。 這對我來說不是一個選擇。 我很想創建我自己的JTextArea ,它接受一個寬度和字符串,並根據寬度和字體設置計算必要的最小高度,但我想我會先考慮先花費時間才能做到這一點。

希望我的問題很明確。 感謝大家的幫助!

它使用基於添加組件的首選大小的絕對定位。

聽起來像布局管理員的工作。

這要求我的JTextArea將在getPreferredSize()上返回正確的維度。

JTextArea textArea = new JTextArea();
textArea.setLineWrap( true );
textArea.setWrapStyleWord( true );
textArea.setText("one two three four five six seven eight nine ten");
System.out.println("000: " + textArea.getPreferredSize());
textArea.setSize(100, 1);
System.out.println("100: " + textArea.getPreferredSize());
textArea.setSize( textArea.getPreferredSize() );
import java.awt.*;
import javax.swing.*;

class FixedWidthLabel {

    public static void main(String[] args) {

        Runnable r = new Runnable() {
            public void run() {
                String pt1 = "<html><body width='";
                String pt2 =
                    "px'><h1>Label Height</h1>" +
                    "<p>Many Swing components support HTML 3.2 &amp;" +
                    " (simple) CSS.  By setting a body width we can cause the " +
                    " component to find the natural height needed to display" +
                    " the component.<br><br>" +
                    "<p>The body width in this text is set to " +
                    "";
                String pt3 =
                    " pixels." +
                    "";

                JPanel p = new JPanel( new BorderLayout() );

                JLabel l1 = new JLabel( pt1 + "125" + pt2 + "125" + pt3 );
                p.add(l1, BorderLayout.WEST);

                JLabel l2 = new JLabel( pt1 + "200" + pt2 + "200" + pt3 );
                p.add(l2, BorderLayout.CENTER);

                JOptionPane.showMessageDialog(null, p);
            }
        };
        SwingUtilities.invokeLater(r);
    }
}

在FixedWidthLabel中描述的解決方案,使用<html><body width="..."將要求程序員將消息作為html字符串的一部分提供。

如果消息類似於invalid integer: i<0 not allowed ,則<必須進行轉義(編碼?),否則無法解釋JLabel將如何解釋html。

這增加了該解決方案的復雜性。

只有當您知道該消息不包含任何此類字符時,您才會好。

好吧,也許如果你知道你的寬度,你可以運行一些測試並計算每個文本字符的寬度,這樣你就可以使用循環來確定每行上適合的字符數和要顯示的字符總數,然后你可以根據有多少行來設置高度。

假設您的文本包含1000個字符(包括空格),並且字符的寬度相當於4像素,那么如果寬度為400,則每行可以容納100個字符,那么您將需要10行。 現在說字體大小的高度是10,你現在知道你需要10 x 10 == 100像素,所以你的TextArea應該是400x100

暫無
暫無

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

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