4

我第一次尝试使用带有 JTextArea 的 JScrollPane 不会计划 -

JFrame window = new JFrame("Scroll test");       
window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
window.setResizable(false);
window.setLayout(null);
window.setVisible(true);
window.setBounds(500, 200, 700, 700);

JTextArea textArea = new JTextArea(5,30);
textArea.setBounds(18, 0, 682, 500);
textArea.setEditable(false);

JScrollPane textScroll = new JScrollPane(textArea,    JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

textScroll.setBounds(0, 0, 18, 500);
window.add(textScroll);

基本上就是这样,我在左侧得到一个滚动窗格,但它没有你可以拖动的那些块状东西之一,即使我用废话填充文本区域所以它扩展到超出范围....谢谢

4

2 回答 2

6

建议:

  • 不要设置 JTextArea 的边界或 preferredSize,因为它们都会限制它的增长,从而阻止功能性滚动条的出现。
  • 最好给 JTextArea 一个有意义的列和行计数。
  • 不要使用空布局或绝对定位。使用嵌套容器要好得多,每个容器都使用合理且易于使用的布局管理器。
  • 不要像这里的其他人建议的那样设置 JScrollPane 的 preferredSize。同样,所需要的只是对 JTextArea 的列和行属性使用合理的数字。
  • 而是让组件自己的首选大小和布局管理器为您完成繁重的工作。

编辑:你说,

我需要使用绝对,因为我的 JFrame 中最终会有更多,布局管理器不会给我自由,我需要正确定位所有内容

我的回答:您之所以这么说,是因为您不熟悉布局管理器的全部用途和功能,以及它们如何使创建复杂的 GUI 比绝对定位简单得多。作为一个 Swing 用户,相信我,你对那句话的看法是错误的。询问任何 Swing 专家,他们都会告诉你同样的情况。例如,想象一下创建一个具有绝对定位的复杂布局,然后意识到您必须在集合中再添加一个 JRadioButton。如果您正在执行绝对定位,则必须调整 GUI 的大小,重置所有位置会受到添加影响的组件的位置。使用布局管理器,特别是嵌套布局及其容器,您可能需要做的就是更改一行代码。

于 2012-10-02T16:54:43.573 回答
4

问题是您将滚动窗格的大小设置为 18 的宽度。考虑到通常的垂直滚动条大约需要 20 像素,您看不到太多。

  1. null除非绝对必要,否则不要使用布局
  2. 不要强制边界/大小等...
  3. 呼叫JFrame.setVisible(boolean)应该是最后一次呼叫

这是一个可以帮助您入门的示例:

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

public class TestScrollPane {

    protected void initUI() {
        JFrame window = new JFrame(TestScrollPane.class.getSimpleName());
        window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        window.setResizable(false);
        JTextArea textArea = new JTextArea(25, 30);

        JScrollPane textScroll = new JScrollPane(textArea, JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
                JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);

        window.add(textScroll);
        window.pack();
        window.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                new TestScrollPane().initUI();
            }
        });
    }
}
于 2012-10-02T16:58:24.613 回答