ScrollPane autoresize content horizo​​ntal without scroll 不起作用

ScrollPane autoresize content horizontal without scroll doesn't work

所以我不知道它是否不起作用,或者我是否希望它以不同的方式工作,但无论如何。

我有一个 org.openide.windows.TopComponent,其中包含三个包含不同项目的列表。这个列表可以通过点击它们的名字来隐藏,所以高度是可变的,这取决于哪些是可见的。如果列表的总高度大于 TopComponent 的高度,则应该出现滚动条。如果宽度发生变化,列表中的元素应该重新排列,以便列表使用可用的整个宽度。所以我遵循的方法是:

顶级组件

在 JScrollPane 内部(提供我需要的滚动条)。仅垂直滚动。

JPanel 内部。

在三个列表(JScrollPanes 和 JList)中,使用各自的 JLabels 来点击和隐藏内容。

因此,如果我遵循此模式,一切看起来都不错,并且当我更改宽度使其变大时,列表中的元素会重新排列以使用新宽度。但是,当我尝试将其再次缩小到原始大小时,列表会保持原样,并且某些元素会隐藏(没有足够的 space 用于所有元素),就好像有一个滚动(水平)一样。但是没有!但是,如果我删除外部滚动窗格并且我确实更改了列表的宽度,则列表的大小会完全调整(当我使它变宽和变窄时)但我没有我需要的垂直滚动...

public class ViewPalettePanel extends TopComponent {

    fcp = new PalettePanel();
    scroll = new JScrollPane(fcp,
            JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
            JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
    GridBagConstraints gbc = new GridBagConstraints();
    gbc.gridx = 1;
    gbc.gridy = 1;
    gbc.fill = GridBagConstraints.BOTH;
    gbc.weightx = 1;
    gbc.weighty = 1;
    add(scroll, gbc);
}

public class PalettePanel extends javax.swing.JPanel {

    public PalettePanel() {
        initComponents();
    }

    private void initComponents() {
        java.awt.GridBagConstraints gridBagConstraints;

        lbl1 = new javax.swing.JLabel();
        scPnl1 = new javax.swing.JScrollPane();
        lbl2 = new javax.swing.JLabel();
        scPnl2 = new javax.swing.JScrollPane();
        lbl3 = new javax.swing.JLabel();
        scPnl3 = new javax.swing.JScrollPane();
        lblPadding = new javax.swing.JLabel();

        setLayout(new java.awt.GridBagLayout());

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(0, 3, 0, 3);
        add(lbl1, gridBagConstraints);

        scPnl1.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scPnl1.setMinimumSize(new java.awt.Dimension(60, 60));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 1;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(0, 3, 0, 3);
        add(scPnl1, gridBagConstraints);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 2;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(0, 2, 0, 2);
        add(lbl2, gridBagConstraints);

        scPnl2.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scPnl2.setMinimumSize(new java.awt.Dimension(60, 60));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 3;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(0, 3, 0, 3);
        add(scPnl2, gridBagConstraints);

        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 4;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(0, 3, 0, 3);
        add(lbl3, gridBagConstraints);

        scPnl3.setHorizontalScrollBarPolicy(javax.swing.ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
        scPnl3.setMinimumSize(new java.awt.Dimension(60, 60));
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 5;
        gridBagConstraints.fill = java.awt.GridBagConstraints.BOTH;
        gridBagConstraints.anchor = java.awt.GridBagConstraints.NORTH;
        gridBagConstraints.weightx = 1.0;
        gridBagConstraints.insets = new java.awt.Insets(0, 3, 0, 3);
        add(scPnl3, gridBagConstraints);
        gridBagConstraints = new java.awt.GridBagConstraints();
        gridBagConstraints.gridx = 0;
        gridBagConstraints.gridy = 6;
        gridBagConstraints.fill = java.awt.GridBagConstraints.VERTICAL;
        gridBagConstraints.weighty = 1.0;
        add(lblPadding, gridBagConstraints);
    }
}

这是我为视觉部分使用的代码(或多或少是完整的)。如果我将 add(scroll, gbc) 更改为 add(fcp, gbc),我想要的调整大小有效,但滚动无效。

有什么想法吗?

我发现将它添加到 JScrollPane 中的 JPanel 中是可行的,但我不确定是否会有任何副作用...(尽管对我来说效果很好)

@Override
public java.awt.Dimension getPreferredSize() {

    int h = super.getPreferredSize().height;
    int w = getParent().getSize().width;
    return new java.awt.Dimension(w, h);
}