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

时间:2017-08-28 14:48:28

标签: java swing layout-manager jlist gridbaglayout

在我的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);

有谁知道如何正确设置?

3 个答案:

答案 0 :(得分:3)

  

但当其中一个人在开始时有一些价值观时,它的规模正在发生变化。怎么避免呢?我

创建JList时,您可以使用:

list.setVisibleRowCount(...);

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

答案 1 :(得分:0)

使用 scroll.setHorizo​​ntalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_​​ALWAYS); scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS);

scroll2.setHorizo​​ntalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_​​ALWAYS); scroll2.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_​​ALWAYS);

我希望这对你有所帮助。

答案 2 :(得分:0)

  

的JList#setVisibleRowCount(...)

使用JDK 1.8.0_141在Windows 10上运行正常。

  

宽度

也许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);
    });
  }
}