1

setVisibleRowCountand setLayoutOrientationonを使用すると予期しない結果が得られ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();
        }
    });
}

JListGUI が表示されると、コンポーネントに直線しか見えませんでした。メソッドをコメントアウトすると、6 つの空の行が表示されたコンポーネントが表示setLayoutOrientation(JList.VERTICAL_WRAP)されます。JListなぜこれが起こったのですか?(注:JList空です)。

4

2 に答える 2

1

問題は、リスト自体のレイアウトにあります。レイアウトの向きが水平の場合、優先スクロール可能ビューポート サイズは優先サイズに対応します。垂直方向の場合、実際には別の方法で計算されます (固定セル サイズに実際のリスト サイズまたはデフォルト値を掛けると仮定します)。

したがって、オーバーライドするかgetPreferredSizegetPreferredScrollableViewportSize選択したサイズに対応させることができます。

于 2012-08-26T06:50:30.927 に答える
0

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.
}
于 2012-08-26T06:47:07.223 に答える