web-dev-qa-db-ja.com

JavaでJListをクリアする方法は?

追加ボタンでデータを追加できるGUIのjListがあります。すべての要素をクリアするClearという別のボタンを追加したいもの。私はこれを試しました:

private void jButtonClearActionPerfomed(Java.awt.event.ActionEvent evt)
{
    DefaultListModel listmodel=new DefaultListModel();
    jList1 = new JList(listmodel);
    if(evt.getSource()==jButtonClear) JList.setListData(new String[0];
    else listmodel.removeAllElements();
}

追加ボタンをクリックすると、要素が追加されます。

クリアボタンをクリックすると、要素が削除されます。

しかし、[追加]ボタンをもう一度クリックすると、jList1には何も表示されません。

14
Pan24112012

JListウィジェットの一部を削除するためだけにJListウィジェット全体を再初期化するべきではありません。変更はUIに「自動的に」同期されるため、代わりに、リストモデルを操作する必要があります。実際にDefaultListModelを使用していると想定すると、「Clear All」機能を実装するにはこれで十分です。

private void jButtonClearActionPerfomed(Java.awt.event.ActionEvent evt) {
    if(evt.getSource()==jButtonClear) {
        DefaultListModel listModel = (DefaultListModel) jList1.getModel();
        listModel.removeAllElements();
    }
}
21
Perception

問題はたくさんありますが、最初の例はコンパイルの問題でいっぱいなので、それが実際のコードではないことを願っています。

JListには、setListDataという静的メソッドがありません。 jList1代わりに。

クリーンボタンをクリックするたびに、新しいモデルとコンポーネントが作成されます...

private void jButtonClearActionPerfomed(Java.awt.event.ActionEvent evt)
{
    // ??
    DefaultListModel listmodel=new DefaultListModel();
    jList1 = new JList(listmodel);
    // ??
    if(evt.getSource()==jButtonClear) jList1.setListData(new String[0]);
    else listmodel.removeAllElements();
}

これまでの逆参照に成功しましたjList1がポイントしていたため、操作しようとするたびに、画面上のコンポーネントを操作しなくなりました。

もう1つの問題は、空の配列をsetListDataメソッドに提供することです。これは、基本的に「リストに何も追加しないでください」と言っているようなものです。

このようなものを試してください。

private void jButtonClearActionPerfomed(Java.awt.event.ActionEvent evt)
{
    DefaultListModel listmodel = (DefaultListModel)jList1.getModel();
    if(evt.getSource()==jButtonClear) {
        listmodel.removeAllElements();
    } else {
        listModel.addElement(new String[]{"Hello"});
    }
}
7
MadProgrammer
DefaultListModel model=new DefaultListModel();
        model.clear();
     jList1.setModel(model);

これを試して

2
Shinwar ismail