我在 JList
上使用 setVisibleRowCount
和 setLayoutOrientation
得到了意外结果。我在 JList
组件上有以下代码:
public class JListDemo extends JPanel {
private DefaultListModel listModel;
private JList list;
private JButton jbAdd;
private JButton jbRemove;
public JListDemo() {
super();
init();
}
private static void createAndShowGUI() {
JFrame frame = new JFrame("JList Demo");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setContentPane(new JListDemo());
frame.setResizable(false);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
private void init() {
listModel = new DefaultListModel();
list = new JList(listModel);
//list.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
list.setVisibleRowCount(6);
list.setLayoutOrientation(JList.VERTICAL_WRAP);
JScrollPane scrollList = new JScrollPane(list);
jbAdd = new JButton("Add");
jbRemove = new JButton("Remove");
JPanel buttonPanel = new JPanel();
buttonPanel.add(jbAdd);
buttonPanel.add(jbRemove);
Box displayBox = Box.createVerticalBox();
displayBox.add(scrollList);
displayBox.add(buttonPanel);
add(displayBox);
bindListeners();
}
private void bindListeners() {
list.addListSelectionListener(new ListSelectionListener() {
@Override
public void valueChanged(ListSelectionEvent e) {
if (e.getValueIsAdjusting() == false) {
if (list.getSelectedIndex() == -1) {
jbRemove.setEnabled(false);
} else {
jbRemove.setEnabled(true);
}
}
}
});
jbAdd.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String name = JOptionPane.showInputDialog(JListDemo.this, "Enter name for list:", "", JOptionPane.PLAIN_MESSAGE);
listModel.addElement(name);
}
});
jbRemove.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
}
});
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
createAndShowGUI();
}
});
}
当 GUI 显示时,我只在 JList
组件上看到一条直线。如果我注释掉 setLayoutOrientation(JList.VERTICAL_WRAP)
方法,那么我可以看到 JList
组件有 6 个可见的空行。为什么会发生这种情况? (注意:JList
为空)。
最佳答案
问题在于列表本身的布局。如果布局方向是水平的,则首选可滚动视口(viewport)尺寸对应于首选尺寸。对于垂直方向,实际上计算方式不同(假设固定单元格大小乘以实际列表大小或默认值)。
因此,您可以重写 getPreferredSize
或 getPreferredScrollableViewportSize
以对应您选择的尺寸。
关于java - 在 JList 上使用 setVisibleRowCount 和 setLayoutOrientation 出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12124202/