Java SWING-JTextArea拟合文本

Java SWING-JTextArea拟合文本,java,swing,user-interface,jtextarea,Java,Swing,User Interface,Jtextarea,我试图设置一个JTextArea的大小来包围文本。 现在我有这个 package messagebubble; import java.awt.BorderLayout; import java.awt.Color; import java.awt.Dimension; import javax.swing.*; public class MainPanel extends JPanel { private JPanel msgHoldingPanel = new JPanel();

我试图设置一个JTextArea的大小来包围文本。 现在我有这个

package messagebubble;


import java.awt.BorderLayout; 
import java.awt.Color;
import java.awt.Dimension;
import javax.swing.*;


public class MainPanel extends JPanel {

private JPanel msgHoldingPanel = new JPanel();


public MainPanel() {

    JTextArea msg2 = new JTextArea();
    msg2.setLineWrap(true);
    msg2.setWrapStyleWord(true);

    msg2.setText("ola tudo bem ");



    msgHoldingPanel.setLayout(new BoxLayout(msgHoldingPanel, BoxLayout.PAGE_AXIS));

    msgHoldingPanel.add(msg2);

    setLayout(new BorderLayout());
    add(msgHoldingPanel, BorderLayout.PAGE_START);

}


private static void createAndShowGui() {
    JFrame frame = new JFrame("MainPanel");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.getContentPane().add(new MainPanel());
    frame.setSize(400, 500);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}

public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
        public void run() {
            createAndShowGui();
        }
    });
}
}
这说明了这一点

我希望它看起来像这样

我可以通过添加以下行来实现

msg2.setMaximumSize(msg2.getPreferredSize());
msg2.setAlignmentX(0);

但如果我设置了一个较长的消息,它不会显示所有内容。我希望它与文本的最宽部分一样宽。

您可以将
msgHoldingPanel
的布局更改为
新的FlowLayout(FlowLayout.LEFT)
?我正在尝试制作一个消息应用程序,我希望在前一个应用程序下显示新消息,这就是BoxLayout的原因。此外,在FlowLayout中,当文本换行时,它会缩小文本区域的宽度。通常,消息传递应用程序只有一个文本区域用于输入消息。然后有一个显示区,用于显示接收/发送的消息。通过这种方式,您实际上知道消息的最终长度,以便更好地进行计算。例如,最初可能会将包裹设置为禁用。然后,首选大小计算可能会得到首选大小,并将其与父容器的宽度进行比较。当首选尺寸大于时,打开换行并重新验证以获得新的首选尺寸。@camickr我已经有了所有这些组件,这只是消息视图,但这是个好主意。虽然我不确定这是否可能,因为SWING中的任何容器的大小都是0drawn@camickr没关系,那很好,非常感谢!您是否可以将
msgHoldingPanel
的布局更改为
新的FlowLayout(FlowLayout.LEFT)
?我正在尝试制作一个消息应用程序,我希望在前一个应用程序下显示新消息,这就是BoxLayout的原因。此外,在FlowLayout中,当文本换行时,它会缩小文本区域的宽度。通常,消息传递应用程序只有一个文本区域用于输入消息。然后有一个显示区,用于显示接收/发送的消息。通过这种方式,您实际上知道消息的最终长度,以便更好地进行计算。例如,最初可能会将包裹设置为禁用。然后,首选大小计算可能会得到首选大小,并将其与父容器的宽度进行比较。当首选尺寸大于时,打开换行并重新验证以获得新的首选尺寸。@camickr我已经有了所有这些组件,这只是消息视图,但这是个好主意。虽然我不确定这是否可能,因为SWING中的任何容器的大小都是0drawn@camickr没关系,那很好,非常感谢!