我得到了一个意想不到的结果使用 setVisibleRowCount
以及 setLayoutOrientation
在 JList
. 我有以下代码 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
是空的)。
2条答案
按热度按时间dzjeubhm1#
你忘了给jlist一个首选的尺寸,所以当你打电话的时候
JFrame.pack
,它最终粉碎了jlist:ma8fv8wu2#
问题在于列表本身的布局。如果布局方向是水平的,则首选的可滚动视口大小与首选大小相对应。对于垂直方向,实际计算方式不同(假设固定单元格大小乘以实际列表大小或默认值)。
因此,您可以
getPreferredSize
或者getPreferredScrollableViewportSize
与您选择的尺码相对应。