使用水平环绕和垂直滚动创建面板

时间:2014-02-16 23:58:21

标签: java swing jscrollpane

我有以下小程序:

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以返回框架的宽度,但仍然将所有标签留在水平行中,即它们退出包装。有没有自定义布局管理器可以做到这一点?在我看来,我们所需要的只是对视口宽度进行编程控制。

1 个答案:

答案 0 :(得分:0)

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

您可以使用Scrollable Panel而不是JPanel,并将其设置为适合最大宽度(在这种情况下,它适合JScrollPane)。

类似的东西:

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

请查看此answer以获得更一般的答案以及指向.class的链接。