java - 如何在仅垂直滚动 Pane 中布局组件?

标签 java swing

我有一个复杂的问题,我无法在任何地方找到答案。

这是一个例子:

public static void main(final String[] args) {
    final JFrame frame = new JFrame("test");
    final JPanel bigPane = new JPanel(new GridLayout(0, 1));
    frame.setContentPane(new JScrollPane(bigPane, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED,
            ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER));
    bigPane.add(new JTextField("reterterter ertertrert erterter ert"));
    bigPane.add(new JTextField(" ertertrert erterter ert"));
    bigPane.add(new JTextField("reterterter ertertrert  ert"));
    bigPane.add(new JTextField("reterterter ertertrert erterter "));
    frame.pack();
    frame.setSize(frame.getSize().width/2, frame.getSize().height);
    frame.setVisible(true);
}

很明显,文本字段被剪切了。更准确地说,bigPane 被切割了。但我希望调整文本字段的大小而不是剪切,这样我们仍然可以使用它们。

由于水平滚动条被禁止出现,我希望布局忘记 View (bigPane)的首选宽度,并始终强制 View 的宽度与视口(viewport)的宽度相匹配。就像水平方向没有虚拟视口(viewport),只有垂直方向。

如果你能帮忙,我找不到解决方案,甚至连 hack 都找不到。

妮可。

PS:看起来 ViewportLayout 的代码不包含任何代码

PS2:这是上面代码的结果的上限 http://www.nraynaud.com/kilombo/testLayout.png看右边。

最佳答案

我认为“正确”的方法是使用 Scrollable 接口(interface):

public class ScrollPaneWidthTrackingPanel extends JPanel implements Scrollable {
    private static final long serialVersionUID = 1L;

    public ScrollPaneWidthTrackingPanel(LayoutManager layoutManager) {
        super(layoutManager);
    }

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

    public int getScrollableBlockIncrement(Rectangle visibleRect, int orientation, int direction) {
        return Math.max(visibleRect.height * 9 / 10, 1);
    }

    public boolean getScrollableTracksViewportHeight() {
        return false;
    }

    public boolean getScrollableTracksViewportWidth() {
        return true;
    }

    public int getScrollableUnitIncrement(Rectangle visibleRect, int orientation, int direction) {
        return Math.max(visibleRect.height / 10, 1);
    }
}

您的两行代码必须更改为:

final ScrollPaneWidthTrackingPanel bigPane = new ScrollPaneWidthTrackingPanel(new GridLayout(0, 1));
frame.setContentPane(new JScrollPane(bigPane));

并且无论框架的大小如何,组件都应始终填满 JScrollPane 的整个宽度。此更改有一个副作用,即组件现在不会填充 JScrollPane 的高度。要解决此问题,请将以下代码添加到 getScrollableTracksViewportHeight 方法的顶部:

if (getParent() instanceof JViewport) {
    JViewport viewport = (JViewport) getParent();
    return component.getPreferredSize().height < viewport.getHeight();
}

关于java - 如何在仅垂直滚动 Pane 中布局组件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1248710/

相关文章:

java - 如何避免 JFrame.EXIT_ON_CLOSE 并优雅地终止 swing 程序

java - 需要帮助将计时器方法放在 JToggleButton 后面

java - JScrollPane:垂直条可见但不活动

Java - JInternalFrame - 无法从 JFrame 关闭 JInternalFrame‏

java - Boxlayout 中 JPanel 周围的空白区域?

Java HttpServer 和 HttpHandler 以及 URLConnection 保持 Activity 状态

java - 有什么理由只为 1 个元素创建一个数组吗?

java - 如何在Java中使用Dropwizard获取swagger.json

java - 后退按钮上的非静态方法错误

java - 几个类似面板的GUI Java