JScrollPane 的大小根据 JList 内容而变化

Size of JScrollPane is changing depending of JList content

在我的 JPanel 中有两个 JScrollPane 代表 JList.

问题是当启动程序时,两个列表都是空的,它们的大小是一样的。但是,当其中一个在开始时具有某些值时,其大小会发生变化。

如何避免?

我正在使用 GridBagLayout,但无论我设置哪个约束,它都不会影响我的滚动窗格。

这是空 JList 的样子。

以及 JList 中具有某些值的示例

gb.gridx = 1;
gb.gridy = 0;
gb.fill = GridBagConstraints.NONE;
add(scroll, gb);

gb.gridx ++;
gb.anchor = GridBagConstraints.CENTER;
gb.fill = GridBagConstraints.NONE;
add(scroll2, gb);

有人知道如何正确设置吗?

But when one of them has some values on the begining its size is changing. How to avoid it? I

创建 JList 时,您可以使用:

list.setVisibleRowCount(...);

这将允许 JList 计算一致的首选大小,即使列表中的数据发生变化也是如此。

使用 scroll.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

scroll2.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS); scroll2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);

希望对您有所帮助。

JList#setVisibleRowCount(...)

使用 JDK 1.8.0_141.

在 Windows 10 上对我来说效果很好

width

也许 JList#setPrototypeCellValue(...) 方法会起作用。

import java.awt.*;
import java.util.*;
import javax.swing.*;

public class ListScrollPaneTest {
  public JComponent makeUI() {
    int visibleRowCount = 8;
    String prototypeCellValue = "mmmmmmmmmmmmmmmmmmmm";

    String[] model1 = Collections.nCopies(20, "aaa").toArray(new String[0]);
    JList<String> list1 = makeJList(visibleRowCount, prototypeCellValue, model1);
    JScrollPane scroll1 = makeTitledScrollPane("Included Groups", list1);

    String[] model2 = {"loooooooooooooooooooooooooooooooooooooooooooooong"};
    JList<String> list2 = makeJList(visibleRowCount, prototypeCellValue, model2);
    JScrollPane scroll2 = makeTitledScrollPane("Excluded Groups", list2);

    JPanel p = new JPanel(new GridBagLayout());
    p.setOpaque(true);
    p.setBackground(Color.GRAY);

    GridBagConstraints gb = new GridBagConstraints();
    gb.insets = new Insets(15, 15, 15, 15);

    gb.gridx = 1;
    gb.gridy = 0;
    gb.fill = GridBagConstraints.NONE;
    p.add(scroll1, gb);

    gb.gridx ++;
    gb.anchor = GridBagConstraints.CENTER;
    gb.fill = GridBagConstraints.NONE;
    p.add(scroll2, gb);

    return p;
  }
  private static <E> JList<E> makeJList(int rowCount, E prototypeCellValue, E[] m) {
    JList<E> list = new JList<>(m);
    list.setVisibleRowCount(rowCount);
    list.setPrototypeCellValue(prototypeCellValue);
    return list;
  }
  private static JScrollPane makeTitledScrollPane(String title, JComponent c) {
    JScrollPane scroll = new JScrollPane(c);
    scroll.setBorder(BorderFactory.createTitledBorder(
                       BorderFactory.createEmptyBorder(), title));
    return scroll;
  }
  public static void main(String... args) {
    EventQueue.invokeLater(() -> {
      JFrame f = new JFrame();
      f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
      f.getContentPane().add(new ListScrollPaneTest().makeUI());
      f.pack();
      f.setLocationRelativeTo(null);
      f.setVisible(true);
    });
  }
}