0

我正在尝试使用 Java Swing 将文本区域放到对话框中。我在设置此 JTextArea 的大小时遇到​​问题。文本区域的宽度总是等于窗口的整个宽度,如果我调整它的大小,它会随着窗口一起伸展。

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 水平对齐到窗口的中心并且不改变它的大小。

我做错了什么?

4

5 回答 5

7

使用JTextArea(int rows, int columns)指定行和列的构造函数,如此处所示并且不要忽略pack()封闭的Window.

于 2013-02-16T19:16:21.857 回答
2
outerPanel.add(scrollPane, BorderLayout.CENTER);

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()”方法,而应该重写滚动窗格的 setMaximumSize() 方法,只返回首选大小。

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

于 2013-02-16T19:41:27.613 回答
1

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

于 2014-04-23T11:55:54.500 回答
1

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

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);
    }
}
于 2013-02-16T19:17:03.953 回答
0

如果 JTextArea 已初始化 JTextArea text = new JTextArea(int rows, int columns)

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

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

于 2015-09-08T08:15:48.890 回答