java - 在 JList 上使用 setVisibleRowCount 和 setLayoutOrientation 出现意外结果

标签 java swing jlist

我在 JList 上使用 setVisibleRowCountsetLayoutOrientation 得到了意外结果。我在 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)尺寸对应于首选尺寸。对于垂直方向,实际上计算方式不同(假设固定单元格大小乘以实际列表大小或默认值)。

因此,您可以重写 getPreferredSizegetPreferredScrollableViewportSize 以对应您选择的尺寸。

关于java - 在 JList 上使用 setVisibleRowCount 和 setLayoutOrientation 出现意外结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12124202/

相关文章:

java - 如何让 Spark Streaming 在单元测试中计算文件中的单词数?

Java Swing 焦点位于 Tab 键上

java - 如何检测鼠标(指针)何时位于 JList 中的文本上?

java - 如何在不发送更改事件的情况下更新 JSlider 的最大值

java - 授予特定 Java Swing 应用程序完全权限

java - 如何绑定(bind)到此 JList 以便更改向用户显示的内容?

Java Swing - Jlabel ActionListener 不会打印选定的复选框

java - 为什么以下代码仅适用于 GridLayout?

java - 通用数组复制的问题

java - 使用 ScheduledExecutorService,如何启动一个线程而不等待其他线程以固定时间间隔完成?