Как я могу изменить размер Java Swing JTextArea

Я пытаюсь поместить текстовую область в диалоговое окно с помощью 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 была горизонтально выровнена по центру окна и не меняла свой размер.

Что я сделал не так?


person Kevin    schedule 16.02.2013    source источник


Ответы (5)


Используйте JTextArea(int rows, int columns) , который указывает строки и столбцы, как показано здесь, и не забудьте pack() окружающий Window.

person trashgod    schedule 16.02.2013

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() панели прокрутки, чтобы просто вернуть предпочтительный размер.

Обратите внимание: при тестировании этих двух решений убедитесь, что вы делаете окно меньше, чем область прокрутки, чтобы увидеть, как каждый макет работает по-разному.

person camickr    schedule 16.02.2013

Я нашел это на простом сайте кодирования. Этот пример кода может быть вам полезен.

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);
    }
}
person hakiko    schedule 16.02.2013
comment
+1 за параллельное сравнение sscce. В моем примере нужна панель прокрутки, а в вашем может быть небольшая invokeLater(). :-) - person trashgod; 16.02.2013
comment
-1 за использование setPreferredSize(), которые представляют собой просто набор случайных чисел, которые не учитывают шрифт, который используется для определения высоты строки каждой строки. Метод setPreferredSize() просто переопределяет значения строк и столбцов, которые вы пытались указать при создании текстовой области. - person camickr; 16.02.2013
comment
@camickr поднимает важный момент, который я упустил из виду; подробнее здесь. Кроме того, остерегайтесь контейнеров без изменения размера и см. также Начальные потоки. - person trashgod; 16.02.2013

Просто вызовите этот метод для вашей текстовой области: setLineWrap(true);

person Houssem Badri    schedule 23.04.2014

Если JTextArea инициализирован JTextArea text = new JTextArea(int rows, int columns)

вы просто вызываете метод text.setLineWrap(true)

затем размер текста фиксируется.

person seung-jun kim    schedule 08.09.2015