阻止JScrollPane扩展其viewPort组件

时间:2013-12-22 00:06:05

标签: java swing jscrollpane flowlayout componentlistener

我有一个subPanel,我偶尔会添加一些组件。我希望FlowLayout能够正确布局它们。我将subPanel放在JScrollPane中让用户看到所有组件,但我不想打扰用户水平滚动。但是,当添加更多组件时,JScrollPane允许subPanel水平扩展。通过这种方式,所有组件都水平显示在一条线上。这意味着最糟糕的布局。

    this.setLayout(new GridLayout(1, 1));
    subPanel = new JPanel(new FlowLayout(FlowLayout.LEADING));
    subPanel.setMaximumSize(new Dimension(500, 4000));
    subPanel.setBackground(Color.CYAN);
    subPane = new JScrollPane(subPanel);
    subPane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
    subPane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    this.add(subPane);

在其他地方我添加了一个componentListener来解决问题,但问题仍然存在:

        @Override
        public void componentShown(ComponentEvent e) {
            subPanel.setSize(getSize());
        }

        @Override
        public void componentResized(ComponentEvent e) {
            subPanel.setSize(getSize());
        }

this是一个JPanel,它完全位于JTabbedPane中,因此占据了所有标签。

2 个答案:

答案 0 :(得分:3)

也许你正在寻找Wrap Layout,当水平空间被填满时,它会将组件包装到下一行。

答案 1 :(得分:2)

  

通过这种方式,所有组件都水平显示在一条线上。这意味着最糟糕的布局。

但这正是FlowLayout应该做的,而且正是它的作用。

为什么不简单地使用面向BoxLayout.PAGE_AXIS的BoxLayout