【问题标题】:Adding ScrollPane to JTextArea将 ScrollPane 添加到 JTextArea
【发布时间】:2012-10-27 00:17:53
【问题描述】:

我正在为我的大学课程做一个项目。我只是想知道是否有人知道如何将滚动条添加到 JTextArea。目前我的 GUI 布局正确,唯一缺少的是滚动条。

这就是 GUI 的样子。正如您在第二个 TextArea 上看到的,我想添加滚动条。

这是我创建窗格的代码。但似乎什么也没发生... t2 是我想要添加到的 JTextArea。

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

任何帮助都会很棒,谢谢!

【问题讨论】:

  • 尽量不要使用 setBounds 和 setLayout(null),而是尝试使用布局管理器。
  • 根据您显示的少量信息,很难知道您做错了什么。也许您正在设置 JTextArea 的大小(您永远不应该这样做)。考虑创建并发布sscce,以便我们查看您的代码实际在做什么。

标签: java swing user-interface jscrollpane jscrollbar


【解决方案1】:

当您的文本超出您的查看区域范围时,滚动条就会出现。不要使用Absolute Positioning,对于这样的闲聊,总是更喜欢Layout Managers,请阅读第一个链接的第一段,了解使用布局管理器的优势。

你只需要使用这个东西:

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();
            }
        });
    }
}

这是相同的结果:

【讨论】:

    【解决方案2】:

    默认情况下,滚动条仅在内容超出可用可视区域时才会显示

    您可以通过JScrollPane#setVerticalScrollBarPolicy 方法更改此设置,将其传递给ScrollPaneConstants.VERTICAL_SCROLLBAR_ALWAYS

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      • 2015-09-04
      相关资源
      最近更新 更多