在jlist上使用setvisiblerowcount和setlayoutorientation时出现意外结果

bq3bfh9z  于 2021-07-09  发布在  Java
关注(0)|答案(2)|浏览(442)

我得到了一个意想不到的结果使用 setVisibleRowCount 以及 setLayoutOrientationJList . 我有以下代码 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 是空的)。

dzjeubhm

dzjeubhm1#

你忘了给jlist一个首选的尺寸,所以当你打电话的时候 JFrame.pack ,它最终粉碎了jlist:

private void init() {
  listModel = new DefaultListModel();
  list = new JList(listModel);
  list.setVisibleRowCount(6);
  list.setLayoutOrientation(JList.VERTICAL_WRAP);
  list.setPreferredSize(new Dimension(300, 400)); <---- set preferred size
  //etc.
}
ma8fv8wu

ma8fv8wu2#

问题在于列表本身的布局。如果布局方向是水平的,则首选的可滚动视口大小与首选大小相对应。对于垂直方向,实际计算方式不同(假设固定单元格大小乘以实际列表大小或默认值)。
因此,您可以 getPreferredSize 或者 getPreferredScrollableViewportSize 与您选择的尺码相对应。

相关问题