JScrollPane滚动问题

时间:2014-02-16 06:31:59

标签: java swing

最初,所有组件仅在单行中的水平方向上对齐。 然后我设置滚动启用面板的大小如下

main.setPreferredSize(scroll.getViewport().getSize());
main.setMaximumSize(new Dimension(scroll.getViewport().getWidth(),Integer.MAX_VALUE));

它使组件开始在多行中对齐,而不是水平地超出屏幕。但是为什么垂直滚动没有发生,实际上组件被覆盖,高度也从视口大小固定,甚至定义了maxsize。

请帮助.........

我需要的只是垂直滚动.....组件不应该超出屏幕水平,但可以超越屏幕垂直。

更新代码:现在我想要的是按钮不应该超出屏幕水平,而是在整个窗口被占用时可以使用垂直滚动。

公共课测试{

public static void main(String[] args) {
    JFrame frame = new JFrame();
    frame.setTitle("JAVA GUI");
    JPanel main = new JPanel();
    JScrollPane scroll = new JScrollPane(main);  
    BoxLayout box = new BoxLayout(main, BoxLayout.Y_AXIS);
    main.setLayout(box);    
    main.add(new JLabel("row 1"));      
    JPanel panel1 = new JPanel(new FlowLayout());

    for(int i=0;i<200;i++){     
        panel1.add(new JButton("b"+i));         
    }
    JPanel panel2 = new JPanel(new FlowLayout());

    for(int i=0;i<200;i++){     
        panel2.add(new JButton("b"+i));         
    }
    JPanel panel3 = new JPanel(new FlowLayout());

    for(int i=0;i<200;i++){     
        panel3.add(new JButton("b"+i));         
    }
    Border border = BorderFactory.createLineBorder(Color.black,10);
    panel1.setBorder(border);   
    panel2.setBorder(border);
    panel3.setBorder(border);
    main.add(panel1);
    main.add(new JLabel("row2"));
    main.add(panel2);
    main.add(new JLabel("row3"));
    main.add(panel3);
    frame.setContentPane(scroll);
    frame.setExtendedState(frame.getExtendedState() | JFrame.MAXIMIZED_BOTH);
    frame.setVisible(true);

}

}

2 个答案:

答案 0 :(得分:0)

只有当组件的首选大小大于滚动窗格的大小时,才会显示滚动条。

FlowLayout将包装组件,但不会更改首选大小。

查看扩展FlowLayout的Wrap Layout,并在组件换行时重新计算首选大小。

答案 1 :(得分:0)

正如camickr在https://stackoverflow.com/a/21816061中指出的那样,这里的主要问题是FlowLayout无法正确计算组件的首选大小。他链接的WrapLayout基本上解决了这个问题。但在这种情况下,这仍然是不够的,因为面板的首选尺寸将只是“显示所有按钮所需的宽度”。为了真正包装按钮,您还必须将main面板替换为实现Scrollable界面的面板,并在true

中返回Scrollable#getScrollableTracksViewportWidth()
class ScrollablePanel extends JPanel implements Scrollable
{
    @Override
    public Dimension getPreferredScrollableViewportSize()
    {
        return getPreferredSize();
    }

    @Override
    public int getScrollableUnitIncrement(Rectangle visibleRect,
        int orientation, int direction)
    {
        return 1;
    }

    @Override
    public int getScrollableBlockIncrement(Rectangle visibleRect,
        int orientation, int direction)
    {
        return 1;
    }

    @Override
    public boolean getScrollableTracksViewportWidth()
    {
        return true;
    }

    @Override
    public boolean getScrollableTracksViewportHeight()
    {
        return false;
    }

}

所以在你的代码中:

JPanel main = new ScrollablePanel();  // Use ScrollablePanel here
JScrollPane scroll = new JScrollPane(main);  
...
JPanel panel1 = new JPanel(new WrapLayout()); // Use WrapLayout here
for(int i=0;i<200;i++){     
    panel1.add(new JButton("b"+i));         
}