Добавление ScrollPane к JTextArea

Я работаю над проектом для моего курса колледжа. Мне просто интересно, если кто-нибудь знает, как добавить полосу прокрутки в JTextArea. В настоящее время у меня правильно выложен графический интерфейс, не хватает только полосы прокрутки.

Вот как выглядит GUI. Как вы можете видеть на второй TextArea, я хотел бы добавить полосу прокрутки.

графический интерфейс пользователя

Это мой код, где я создаю панель. Но, похоже, ничего не происходит... t2 - это JTextArea, к которому я хочу добавить это.

scroll = new JScrollPane(t2);
    scroll.setBounds(10,60,780,500);
    scroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS);

Любая помощь будет отличной, спасибо!

2 ответа

Решение

Полоса прокрутки появляется, когда ваш текст выходит за пределы области просмотра. Не используйте Абсолютное Позиционирование, для такого небольшого разговора всегда предпочитайте Менеджеров по расположению, прочитайте первый параграф первой ссылки, чтобы узнать преимущество использования Менеджера по расположению.

Что вам просто нужно сделать, это использовать эту штуку:

JTextArea msgArea = new JTextArea(10, 10);
msgArea.setWrapStyleWord(true);
msgArea.setLineWrap(true);      

JScrollPane msgScroller = new JScrollPane();        
msgScroller.setBorder(
    BorderFactory.createTitledBorder("Messages"));
msgScroller.setViewportView(msgArea);

panelObject.add(msgScroller);

Вот небольшая программа для вашего понимания:

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

public class JTextAreaScroller
{
    private JTextArea msgArea;
    private JScrollPane msgScroller;
    private JTextArea logArea;
    private JScrollPane logScroller;
    private JButton sendButton;
    private JButton terminateButton;
    private Timer timer;
    private int counter = 0;
    private String[] messages = {
                                    "Hello there\n",
                                    "How you doing ?\n",
                                    "This is a very long text that might won't fit in a single line :-)\n",
                                    "Okay just to occupy more space, it's another line.\n",
                                    "Don't read too much of the messages, instead work on the solution.\n",
                                    "Byee byee :-)\n",
                                    "Cheers\n"
                                };

    private ActionListener timerAction = new ActionListener()
    {
        @Override
        public void actionPerformed(ActionEvent ae)
        {
            if (counter < messages.length)
                msgArea.append(messages[counter++]);
            else
                counter = 0;
        }
    };

    private void displayGUI()
    {
        JFrame frame = new JFrame("Chat Messenger Dummy");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel contentPane = new JPanel();
        contentPane.setLayout(new BorderLayout(5, 5));

        JPanel centerPanel = new JPanel();
        centerPanel.setLayout(new GridLayout(0, 1, 5, 5));

        logArea = new JTextArea(10, 10);
        logArea.setWrapStyleWord(true);
        logArea.setLineWrap(true);      

        logScroller = new JScrollPane();        
        logScroller.setBorder(
            BorderFactory.createTitledBorder("Chat Log"));
        logScroller.setViewportView(logArea);

        msgArea = new JTextArea(10, 10);
        msgArea.setWrapStyleWord(true);
        msgArea.setLineWrap(true);      

        msgScroller = new JScrollPane();        
        msgScroller.setBorder(
            BorderFactory.createTitledBorder("Messages"));
        msgScroller.setViewportView(msgArea);

        centerPanel.add(logScroller);
        centerPanel.add(msgScroller);

        JPanel bottomPanel = new JPanel();

        terminateButton = new JButton("Terminate Session");
        terminateButton.addActionListener(new ActionListener()
        {
            @Override
            public void actionPerformed(ActionEvent ae)
            {
                if (timer.isRunning())
                    timer.stop();
                else
                    timer.start();
            }
        });
        sendButton = new JButton("Send");

        bottomPanel.add(terminateButton);
        bottomPanel.add(sendButton);

        contentPane.add(centerPanel, BorderLayout.CENTER);
        contentPane.add(bottomPanel, BorderLayout.PAGE_END);

        frame.setContentPane(contentPane);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);

        timer = new Timer(1000, timerAction);
        timer.start();
    }

    public static void main(String... args)
    {
        EventQueue.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new JTextAreaScroller().displayGUI();
            }
        });
    }
}

Вот результат того же:

JTEXTAREA SCROLLER

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

Вы можете изменить это через JScrollPane#setVerticalScrollBarPolicy метод, передавая это ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS

Другие вопросы по тегам