Java - 使用JScrollPane

时间:2012-10-02 16:43:07

标签: java swing jframe jscrollpane jtextarea

我第一次尝试将JScrollPane与JTextArea一起使用是不会计划的 -

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

基本上就是这样,我在左手边看到了一个滚动窗格,但它是空的,你可以拖动其中一个块的东西,即使我用垃圾填充文本区域,所以它扩展超出界限....谢谢

2 个答案:

答案 0 :(得分:6)

建议:

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

修改:您说明,

  

我需要使用绝对值,因为我最终会在我的JFrame中拥有更多内容,布局管理器不会给我自由放置所需的自由

我的回答:您只是这样说,因为您不熟悉布局管理器的全部使用和强大功能,以及它们如何使创建复杂的GUI比绝对定位简单得多。相信我作为一个Swing用户从回来开始,你就像错误一样错误。问任何Swing专家,他们会告诉你相同的。例如,想象一下创建一个具有绝对定位的复杂布局,然后意识到你必须再添加一个JRadioButton到一个集合。如果您正在进行绝对定位,则必须调整GUI的大小,重置位置将受添加影响的所有组件的位置。使用布局管理器,特别是嵌套布局及其容器内部,您可能需要做的就是更改代码的一行。另一种情况:如果程序在不同的平台上运行,那么绝对定位就会冒着极其丑陋的GUI的风险,布局管理人员将为您解决所有问题。

答案 1 :(得分:4)

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

  1. 除非绝对必要,否则请勿使用null布局
  2. 不要强迫边界/大小等......
  3. JFrame.setVisible(boolean)的通话应该是最后一次通话
  4. 以下是一个可以帮助您入门的示例:

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