2014-02-16 29 views
2

我有以下的小程序:创建水平包装和垂直滚动面板

import java.awt.BorderLayout; 
import java.awt.Component; 
import java.awt.FlowLayout; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 

public class ScrollPanePlay extends JFrame 
{ 
    public static void main(String[] args) 
    { 
    ScrollPanePlay frame = new ScrollPanePlay(); 
    frame.setVisible(true); 
    } 

    public ScrollPanePlay() 
    { 
    setDefaultCloseOperation(DISPOSE_ON_CLOSE); 

    JPanel panel = new JPanel(this); 
    panel.setLayout(new FlowLayout(FlowLayout.LEFT)); 
    panel.add(new JLabel("one")); 
    panel.add(new JLabel("two")); 
    panel.add(new JLabel("three")); 
    panel.add(new JLabel("four")); 
    panel.add(new JLabel("five")); 

    JScrollPane scrollPane = new JScrollPane(panel); 
    add(panel, BorderLayout.CENTER); // <== add either panel or scrollpane 
    pack(); 
    } 

} 

如果我添加面板,然后在面板包装的标签时,由窗口窄,如预期的FlowLayout。

如果我将面板添加到滚动窗格并将滚动窗格添加到框架,那么标签不会换行,因为scrollPane报告足够的宽度(我猜)可容纳所有标签,并允许用户滚动去看他们。

我想滚动的行为,但只适用于垂直 - 我想用户选择他想看到的宽度,并让滚动条只出现垂直滚动。我怎样才能做到这一点?

我试着扩展JScrollPane,并从getScrollableTracksViewportWidth()返回true,但是,正如我所料,这不会做我想做的事情,因为它是我希望事物跟踪的框架宽度,而不是视口。我试着扩展JPanel并重写getWidth来返回框架的宽度,但仍然将所有标签保留在水平行中,即它们退出包装。有没有什么会做到这一点没有自定义布局管理器?对我来说,我们需要的是对视口宽度进行编程控制。

+2

这可能是'FlowLayout'本身的问题,请试着看看['WrapLayout'](http://tips4java.wordpress.com/2008/11/06/wrap-layout/)而不是 – MadProgrammer

+0

I不要让你的目标,因为一边不要忘记改变,增加滚动增量 – mKorbel

回答

0

这是一个视口问题。在JScrollPane中,JPanel不会调整大小以适应JScrollPane大小(这就是ScrollPanes存在的原因)。

您可以使用可滚动面板而不是JPanel,并将其设置为适合最大宽度(在本例中,它适合JScrollPane)。

喜欢的东西:

ScrollablePanel panel = new ScrollablePanel(new BorderLayout()); 
panel.setScrollableWidth(ScrollablePanel.ScrollableSizeHint.FIT); 

检查这个answer多了几分一般的答案和链接到的.class。