JScrollPane的大小取决于JList的内容
在我的JPanel
我有两个JScrollPane
代表JList
。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);
一些值的例子有没有人任何想法如何正确设置它?
但是当它们中的一个在开始时具有一些值时,其大小正在改变。如何避免它?我
当您创建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);
我希望这可以帮助你。
请使用代码格式设置代码和代码片段,结构化文档(如HTML/XML或输入/输出)。为此,请选择文本并单击邮件发布/编辑表单顶部的“{}”按钮。问题或答案的拥有者可以随时编辑它。 –
可悲的是,它不是。我认为问题出现在Jlist开始的时候是空的。 – up94up
的JList#setVisibleRowCount(...)
工作正常,我在Windows 10使用JDK 1.8.0_141。
宽度
也许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);
});
}
}
为了更好地提供帮助,请发布[MCVE]或[简短,独立,正确的示例](http://www.sscce.org/)。 –
您可以使用[JList#getPreferredScrollableViewportSize()](https://docs.oracle.com/javase/7/docs/api/javax/swing/JList.html#getPreferredScrollableViewportSize()) – mKorbel