【问题标题】:Create panel with horizontal wrap and vertical scroll创建具有水平环绕和垂直滚动的面板
【发布时间】:2014-03-16 03:01:30
【问题描述】:

我有以下小程序:

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 所预期的那样。

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

我想要滚动行为,但仅适用于垂直 - 我希望用户选择他想要查看的宽度,并让滚动条仅在垂直滚动时出现。我该怎么做?

我尝试扩展 JScrollPane 并从 getScrollableTracksViewportWidth() 返回 true,但是,正如我所料,这并没有达到我想要的效果,因为我想要跟踪的是框架的宽度,而不是视口。我尝试扩展 JPanel 并覆盖 getWidth 以返回框架的宽度,但这仍然将所有标签留在水平行中,即它们退出包装。如果没有自定义布局管理器,有什么可以做到这一点吗?在我看来,我们需要的只是对视口宽度的编程控制。

【问题讨论】:

  • 问题可能出在FlowLayout 本身,请尝试查看WrapLayout
  • 我没有得到你的目标,顺便别忘了改变,增加滚动增量

标签: java swing jscrollpane


【解决方案1】:

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

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

类似:

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

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

【讨论】:

    猜你喜欢
    • 2016-07-24
    • 1970-01-01
    • 2013-10-13
    • 2019-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-02
    • 2014-01-09
    相关资源
    最近更新 更多