【问题标题】:Resizing panel with flow layout does not invoke the scroll bars使用流布局调整面板大小不会调用滚动条
【发布时间】:2010-10-05 21:58:33
【问题描述】:

我有一个 包含面板 JPanel 带有流布局,包含面板JScrollPane 中, 包含面板 包含一堆其他的JPanels,即内部面板。所有内板都具有相同的尺寸。如果有更多面板,则 包含面板 可以保持其宽度,然后将它们向下网格化,如果有更多面板,则 包含面板 > 可以保持其高度,则内面板在同一网格中对齐,但最后一行除外,它与上一行居中。

当我调整对话框的大小时,包含面板会扩展并且布局流布局执行其职责,但是尽管面板的大小超过了 JScrollPane 的边界,但滚动条不会出现.

当我动态调整包含面板的大小时,如何控制滚动条的外观?

至于图片,他们应该总结一下:

扩大对话框宽度后:

亚当

【问题讨论】:

  • 一个独立的最小代码示例可能会帮助人们更容易地理解您的问题。
  • “向下网格化”是什么意思?屏幕截图也会有所帮助。通常,您可以使用动态布局或滚动,但不能同时使用两者。
  • 有趣的是我从来没有使用过FlowLayout,因为它对于任何非平凡的 GUI 来说都太原始了,所以我没有意识到你在描述它的默认行为。

标签: swing jscrollpane java flowlayout


【解决方案1】:

您需要使包含面板实现Scrollable,并根据宽度设置首选的可滚动视口大小。

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

public class Test
{
    public static void main(String args[])
    {
        EventQueue.invokeLater(new Runnable()
        {
            public void run()
            {
                JPanel container = new ScrollablePanel();
                container.setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
                for( int i = 0; i < 20; ++i )
                {
                    JPanel p = new JPanel();
                    p.setBorder(BorderFactory.createLineBorder(Color.RED));
                    p.setPreferredSize(new Dimension(50, 50));
                    p.add(new JLabel("" + i));
                    container.add(p);
                }

                JScrollPane scroll = new JScrollPane(container);
                scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
                scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);

                JFrame f = new JFrame("Test");
                f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);                    
                f.getContentPane().add(scroll);                    
                f.pack();
                f.setSize(250, 300);
                f.setLocationRelativeTo(null);
                f.setVisible(true);
            }
        });
    }
}

class ScrollablePanel extends JPanel implements Scrollable
{
    public Dimension getPreferredSize()
    {
        return getPreferredScrollableViewportSize();
    }

    public Dimension getPreferredScrollableViewportSize()
    {
        if( getParent() == null )
            return getSize();
        Dimension d = getParent().getSize();
        int c = (int)Math.floor((d.width - getInsets().left - getInsets().right) / 50.0);
        if( c == 0 )
            return d;
        int r = 20 / c;
        if( r * c < 20 )
            ++r;
        return new Dimension(c * 50, r * 50);
    }

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction)
    {
        return 50;
    }

    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction)
    {
        return 10;
    }

    public boolean getScrollableTracksViewportHeight()
    {
        return false;
    }

    public boolean getScrollableTracksViewportWidth()
    {
        return getParent() != null ? getParent().getSize().width > getPreferredSize().width : true;
    }
}

为简单起见,所有数字都经过硬编码,但您应该明白。

【讨论】:

  • WOW,我永远,getPreferredScrollableViewportSize()不管我做什么都没有被调用,只有getPreferredSize()被调用了,所以我从头开始,然后它工作了,沮丧我比较了两个代码,显然 NetBeans 在某些情况下会生成一个 setPreferredSize(w,h) ,一旦设置好,视口布局就会跳过该方法。骑得很好,这是个混蛋。谢谢你的帮助,我想我得到了我需要的一切。
  • 为什么我不使用 GUI builder :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-19
  • 1970-01-01
相关资源
最近更新 更多