Добавить прокрутку в текстовую область

Как я могу добавить полосу прокрутки в свою текстовую область. Я пробовал с этим кодом, но он не работает.

middlePanel=new JPanel();
middlePanel.setBorder(new TitledBorder(new EtchedBorder(), "Display Area"));

// create the middle panel components
display = new JTextArea(16, 58);
display.setEditable(false); // set textArea non-editable
scroll = new JScrollPane(display);
scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

//Add Textarea in to middle panel
middlePanel.add(scroll);
middlePanel.add(display);

person Ravi    schedule 16.04.2012    source источник
comment
Что произойдет, когда текст достигнет предела области?   -  person talnicolas    schedule 16.04.2012


Ответы (4)


После добавления JTextArea в JScrollPane здесь:

scroll = new JScrollPane(display);

Вам не нужно снова добавлять его в другой контейнер, как вы:

middlePanel.add(display);

Просто удалите последнюю строку кода, и все заработает. Как это:

    middlePanel=new JPanel();
    middlePanel.setBorder(new TitledBorder(new EtchedBorder(), "Display Area"));

    // create the middle panel components

    display = new JTextArea(16, 58);
    display.setEditable(false); // set textArea non-editable
    scroll = new JScrollPane(display);
    scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

    //Add Textarea in to middle panel
    middlePanel.add(scroll);

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

new JScrollPane( myComponent ) 

или установить вид следующим образом:

JScrollPane pane = new JScrollPane ();
pane.getViewport ().setView ( myComponent );

Дополнительно:

Вот полностью рабочий пример, так как вы все еще не заработали:

public static void main ( String[] args )
{
    JPanel middlePanel = new JPanel ();
    middlePanel.setBorder ( new TitledBorder ( new EtchedBorder (), "Display Area" ) );

    // create the middle panel components

    JTextArea display = new JTextArea ( 16, 58 );
    display.setEditable ( false ); // set textArea non-editable
    JScrollPane scroll = new JScrollPane ( display );
    scroll.setVerticalScrollBarPolicy ( ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS );

    //Add Textarea in to middle panel
    middlePanel.add ( scroll );

    // My code
    JFrame frame = new JFrame ();
    frame.add ( middlePanel );
    frame.pack ();
    frame.setLocationRelativeTo ( null );
    frame.setVisible ( true );
}

И вот что вы получите: введите здесь описание изображения

person Mikle Garin    schedule 16.04.2012
comment
Добавлен код, который вы должны использовать. Может быть, вы пытаетесь добавить его где-то еще? Если вы сделаете это, JTextArea выйдет из области прокрутки и поместится на новое место. - person Mikle Garin; 16.04.2012
comment
больше нигде не использую. - person Ravi; 16.04.2012
comment
Он должен работать. Кажется, у вас есть дополнительный код, который влияет либо на контейнер, либо на панель прокрутки. Проверьте отредактированный ответ - есть полный рабочий пример. А может быть, это не то, что вы хотите получить? - person Mikle Garin; 16.04.2012
comment
да сейчас работает. я добавлял текстовое поле на панель вместо middlePanel.add(scroll), но я просто заменил это и заработал, спасибо :) - person Ravi; 16.04.2012
comment
Как указал @LihO в своем ответе, вызов setBounds для объекта scroll - это то, что заставляет его работать и для меня. - person CarlosRos; 01.03.2016
comment
Это верно только для нулевого макета (он устанавливает null в качестве макета панели содержимого в начале), но мой пример не использует его, поэтому он не требует вызова setBounds. Вам действительно нужно ознакомиться с руководством по макетам Swing, чтобы понять как компоненты размещаются внутри контейнеров, что решит множество возможных проблем для вас в будущем :) - person Mikle Garin; 01.03.2016

Мое наивное предположение заключалось в том, что размер области прокрутки будет определяться автоматически...

Единственным решением, которое действительно сработало для меня, было явное определение границ JScrollPane:

import javax.swing.*;

public class MyFrame extends JFrame {

    public MyFrame()
    {
        setBounds(100, 100, 491, 310);
        getContentPane().setLayout(null);

        JTextArea textField = new JTextArea();
        textField.setEditable(false);

        String str = "";
        for (int i = 0; i < 50; ++i)
            str += "Some text\n";
        textField.setText(str);

        JScrollPane scroll = new JScrollPane(textField);
        scroll.setBounds(10, 11, 455, 249);                     // <-- THIS

        getContentPane().add(scroll);
        setLocationRelativeTo ( null );
    }
}

Возможно, это поможет некоторым будущим посетителям :)

person LihO    schedule 12.02.2014
comment
Небольшое примечание: размер и расположение области прокрутки будут определяться автоматически, но только в том случае, если вы предоставите какой-либо макет контейнеру, в который вы его добавляете. Прямо сейчас в вашем примере вы установили макет null для панели содержимого: getContentPane().setLayout(null); - поэтому вам нужно указать границы вручную. В противном случае, если вы установите любой макет, например new BorderLayout(), он автоматически рассчитает и установит границы для вашей области прокрутки. - person Mikle Garin; 01.03.2016

Попробуйте добавить эти две строки в свой код. Надеюсь, это сработает. Это сработало для меня :)

display.setLineWrap(true);
display.setWrapStyleWord(true);

Изображение вывода показано ниже

введите здесь описание изображения

person farhangdon    schedule 20.10.2015

Самый простой способ реализовать полосу прокрутки с использованием Java Swing, как показано ниже:

  1. Перейти к представлению «Дизайн»
  2. щелкните правой кнопкой мыши на textArea
  3. Выберите объемный звук с помощью JScrollPane
person Chandra_lal    schedule 26.08.2020