3

実行時に要素を追加すると、ラップが適切に更新されないようです。フレームが再検証されると、最後の行で新しいアイテムをレンダリングし続けます (古いラップされた行を保持します) が、続行せずに新しい行にラップします。

リストは、フレームのサイズが変更された場合にのみ再ラップできます (無効化、検証、および再描画は機能しません)。

    final JFrame frame = new JFrame();
    final Vector<String> strings = new Vector<String>();
    JList list = new JList(strings);

    list.setLayoutOrientation(JList.HORIZONTAL_WRAP);
    list.setVisibleRowCount(-1);

    strings.add(" ------------------ add ------------------");
    strings.add(" ------------------ add ------------------");

    JButton button = new JButton("add");
    button.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent arg0) {
            strings.add(" ------------------ add ------------------");
            //frame.invalidate();
            //frame.validate();
            //frame.repaint();
        }
    });

    JPanel panel = new JPanel(new BorderLayout());
    panel.add(list, BorderLayout.CENTER);
    panel.add(button,BorderLayout.SOUTH);

    frame.setSize(400,400);
    frame.add(panel);
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setVisible(true);
4

1 に答える 1

3

ListModelたとえば、 を使用しますDefaultListModelJListオブジェクトがモデルに追加またはモデルから削除されたときに更新されるように、正しいイベントを「起動」します。

public static void main(String[] args) {

    JFrame frame = new JFrame("Test");

    final DefaultListModel model = new DefaultListModel();

    model.addElement("---added---");
    model.addElement("---added---");

    frame.add(new JList(model), BorderLayout.CENTER);
    frame.add(new JButton(new AbstractAction("Add") {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            model.addElement("---added again---");
        }
    }), BorderLayout.SOUTH);

    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(200, 150);
    frame.setVisible(true);
}

「ラップの問題」については、JList(ListModel)コンストラクターを使用するだけJList.VERTICALで、必要に応じてリストをレンダリングするプロパティが使用されます。

于 2011-12-29T23:15:58.817 に答える