如何调整Java Swing JTextArea的大小

如何调整Java Swing JTextArea的大小,java,swing,layout-manager,jtextarea,preferredsize,Java,Swing,Layout Manager,Jtextarea,Preferredsize,我试图使用JavaSwing将文本区域放到对话框中。我在设置此区域的大小时遇到问题。文本区域的宽度始终等于窗口的整个宽度,如果我调整窗口的大小,它将随窗口一起拉伸 private void arrangeComponents() { JTextArea textArea = new JTextArea(); JPanel outerPanel = new JPanel(); outerPanel.setLayout(new BoxLayout(outerPanel, Bo

我试图使用JavaSwing将文本区域放到对话框中。我在设置此区域的大小时遇到问题。文本区域的宽度始终等于窗口的整个宽度,如果我调整窗口的大小,它将随窗口一起拉伸

private void arrangeComponents() {
    JTextArea textArea = new JTextArea();
    JPanel outerPanel = new JPanel();
    outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.PAGE_AXIS));

    JScrollPane scrollPane = new JScrollPane(textArea);
    outerPanel.add(scrollPane, BorderLayout.CENTER);

    Container contentPane = getContentPane();
    contentPane.add(outerPanel, BorderLayout.CENTER);
}
我希望JTextArea与窗口中心水平对齐,并且不改变其大小


我做错了什么?

使用指定行和列的构造函数,如图所示,不要忽略了
pack()
封闭的
窗口

我从一个简单的编码站点上找到了它。此代码示例可能对您有用

import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;

public class JTextAreaTest {
    public static void main(String[] args) {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame frame = new JFrame("JTextArea Test");
        frame.setLayout(new FlowLayout());
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        String text = "A JTextArea object represents a multiline area for displaying text. "
                + "You can change the number of lines that can be displayed at a time, "
                + "as well as the number of columns. You can wrap lines and words too. "
                + "You can also put your JTextArea in a JScrollPane to make it scrollable.";
        JTextArea textAreal = new JTextArea(text, 5, 10);
        textAreal.setPreferredSize(new Dimension(100, 100));
        JTextArea textArea2 = new JTextArea(text, 5, 10);
        textArea2.setPreferredSize(new Dimension(100, 100));
        JScrollPane scrollPane = new JScrollPane(textArea2,
                JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
        textAreal.setLineWrap(true);
        textArea2.setLineWrap(true);
        frame.add(textAreal);
        frame.add(scrollPane);
        frame.pack();
        frame.setVisible(true);
    }
}
BoxLayout不接受约束,因此不需要BorderLayout.CENTER

问题是BoxLayout尊重组件的最大大小,而对于滚动窗格,组件的最大大小设置得非常大

与其使用BoxLayout,不如使用带有FlowLayout的面板

运行下面的示例以查看您当前正在执行的操作。然后注释掉setLayout(…)语句并再次运行。默认情况下,面板使用FlowLayout,因此您将获得所需的内容

import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;

public class SSCCE extends JPanel
{
    public SSCCE()
    {
          setLayout( new BoxLayout(this, BoxLayout.PAGE_AXIS));

          JTextArea textArea = new JTextArea(5, 30);
          JScrollPane scrollPane = new JScrollPane(textArea);
          //scrollPane.setMaximumSize( scrollPane.getPreferredSize() );

          add(scrollPane);
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new SSCCE() );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}
或者,如果确实要保留BoxLayout,请保留setLayout(…)语句,然后将最大大小设置为等于首选大小。许多人会说,您永远不应该直接调用“setXXX()”方法,而应该重写scrollpane的setMaximumSize()方法,只返回首选大小


请注意,在测试这两种解决方案时,请确保使窗口比滚动窗格小,以查看每个布局的工作方式不同

只需为您的文本区域调用该方法:
setLineWrap(true)

如果JTextArea已初始化
JTextArea text=新的JTextArea(int行,int列)

您只需调用方法
text.setLineWrap(true)


然后文本的大小是固定的。

+1用于并排比较。我的示例需要一个滚动窗格,而您的示例可以使用一点
invokeLater()
:-)-1用于使用setPreferredSize(),它只是一组随机数,不考虑用于确定每行行高度的字体。setPreferredSize()方法只是覆盖了您在创建文本区域时试图指定的行、列值。@camickr提出了一个我忽略的关键点;更多还有,当心,也看看。
import java.awt.*;
import javax.swing.*;
import javax.swing.text.*;

public class SSCCE extends JPanel
{
    public SSCCE()
    {
          setLayout( new BoxLayout(this, BoxLayout.PAGE_AXIS));

          JTextArea textArea = new JTextArea(5, 30);
          JScrollPane scrollPane = new JScrollPane(textArea);
          //scrollPane.setMaximumSize( scrollPane.getPreferredSize() );

          add(scrollPane);
    }

    private static void createAndShowUI()
    {
        JFrame frame = new JFrame("SSCCE");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add( new SSCCE() );
        frame.pack();
        frame.setLocationRelativeTo( null );
        frame.setVisible( true );
    }

    public static void main(String[] args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                createAndShowUI();
            }
        });
    }
}