【问题标题】:Limit Jscrollpanes width to Parents width when dynamically adding content动态添加内容时将 Jscrollpane 宽度限制为父宽度
【发布时间】:2019-05-14 09:46:45
【问题描述】:

嘿,我是新手

我希望动态内容与父窗口一样宽(并根据其宽度自动调整大小),但如果需要能够向下滚动(如果内容超出可用空间)。

我正在向JScrollPanel 添加和删除多个内容,例如JpanelJinternalFrame

我尝试过的大多数事情,无论是自定义类还是布局管理器,要么只是隐藏了滚动条(但并没有阻止内容永远在水平方向添加) 或者只是缩小了内容。

我试过https://tips4java.wordpress.com/2009/12/20/scrollable-panel/ 但它只会拉伸或收缩
public class MainView extends JFrame {

    private ScrollablePanel contentPane;
    private JScrollPane scrollPane;
...

在构造函数中:

...
contentPane = new ScrollablePanel(new BorderLayout());
        contentPane.setScrollableWidth(ScrollablePanel.ScrollableSizeHint.NONE);
    contentPane.setScrollableHeight(ScrollablePanel.ScrollableSizeHint.NONE);
        contentPane.setBorder(new EmptyBorder(1, 1, 1, 1));
        scrollPane = new JScrollPane(contentPane);
        setContentPane(scrollPane);

不同的 Sizehints 或布局,如默认 Flowlayout,要么更差,要么相同

垂直滚动按预期工作,但不限制水平方向的内容(似乎我不允许添加屏幕截图) 我不需要这个类,如果你认为它可以用其他方式实现

【问题讨论】:

  • 你的动态内容是什么?是文字吗?是图像吗?还有什么?或许您可以将minimal reproducible example 放在一起并发布?
  • 目前 Jinternal 帧从文件中打开,如果不再需要则丢弃。当我到达它时,我发布了一个 mcve

标签: java swing jscrollpane


【解决方案1】:

前段时间我也遇到过类似的问题,通过自定义 JPanel 解决了:

/**
 * A panel that can be used in a JScrollPane which always adapts to the
 * width of the JScrollPane (so only vertical scrolling will happen).
 */
public class ParentWidthPanel extends JPanel implements Scrollable {

    private static final long serialVersionUID = 1L;

    @Override
    public Dimension getPreferredScrollableViewportSize() {
        return getPreferredSize();
    }

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

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

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

    @Override
    public boolean getScrollableTracksViewportHeight() {
    if (getParent() instanceof JViewport) {
       return ((getParent()).getHeight() > getPreferredSize().height);
    }
    return false;
    }

}

重点是让getScrollableTracksViewportWidth() 方法返回true

【讨论】:

  • 呃,你能指定如何使用它吗?而不是滚动面板?里面?
  • JScrollPane 中使用它来托管其他内容,例如构建一个可滚动的 JPanel 列表以适应其宽度。
  • 好的,它现在像我想要的那样在父母的宽度内排列它们。谢谢。但是发生了一些奇怪的事情:垂直滚动条仅在主窗口小于第一行内容时出现。即使我让它们总是出现在第一行后面的内容也不可见。 (如果内容超过显示大小)我无法向下滚动。也许不相关所以生病继续修修补补
  • 关于滚动条:这不取决于操作系统吗?我认为有一些设置会使滚动条仅在实际需要时出现,但在无法滚动时隐藏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-02-15
  • 2023-03-12
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多