0

SpinnerListModelを持つJSpinnerがあります。私がやりたいことは、リストがモデルに読み込まれ、JSpinner がフレームに表示されると、スピナーから要素を削除できるようにすることです。これは、同じフレームのボタンをクリックするだけで実行できます。クリック アクションのハンドラーは、スピナーで現在選択されている要素を削除します。私の現在の実装の問題は、このハンドラーが返されたときに、スピナーからIndexOutOfBoundsExeceptionが発生することです (つまり、リストから最後の要素を削除したとき)。これは、JSpinner が適切に更新されていないことを示しています。

fireStateChanged を使用するためだけに、JSpinnerを拡張する新しいクラスExtendedSpinnerを作成しました。これは、要素が削除されたときにJSpinnerを更新するためです。リストの途中にある要素を削除するには問題なく機能しますが、最後の要素には機能しません。

私は何を間違っていますか?これはコードです:

package image;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JSpinner;
import javax.swing.SpinnerListModel;
import javax.swing.SpinnerModel;

public class ImageDealer2 {

protected JFrame selectCoverFrame;
protected JExtendedSpinner spinnerCovers;
protected JButton deleteCoverButton;
protected SpinnerListModel spinnerCoversM;
protected ArrayList<Object> stringList = new ArrayList<Object>();

public ImageDealer2() {
selectFrameInit();
}


public void selectFrameInit(){

selectCoverFrame = new JFrame("Select");
selectCoverFrame.setSize(new Dimension(500,100));
selectCoverFrame.getContentPane().setLayout(new    BoxLayout(selectCoverFrame.getContentPane(),BoxLayout.Y_AXIS));


stringList.add("a");
stringList.add("b");
stringList.add("c");
stringList.add("d");

spinnerCoversM = new SpinnerListModel(stringList);
spinnerCovers = new JExtendedSpinner(spinnerCoversM);

deleteCoverButton = new JButton("Delete current element");
DeleteCurrentCoverHandler deleteCurrentCoverHandler = new DeleteCurrentCoverHandler();
deleteCoverButton.addActionListener(deleteCurrentCoverHandler);

selectCoverFrame.getContentPane().add(spinnerCovers);
selectCoverFrame.getContentPane().add(deleteCoverButton);
selectCoverFrame.setVisible(true);
}



public class JExtendedSpinner extends JSpinner{

/**
 * 
 */
private static final long serialVersionUID = 6109392800971431371L;

public JExtendedSpinner() {
    super();
    // TODO Auto-generated constructor stub
}

public JExtendedSpinner(SpinnerModel model) {
    super(model);
    // TODO Auto-generated constructor stub
}

public void fireUpdate(){
    this.fireStateChanged();
}
}    

private class DeleteCurrentCoverHandler implements ActionListener {

public void actionPerformed(ActionEvent e) {
    if (stringList.size()>1){
        stringList.remove(spinnerCovers.getValue());
        spinnerCoversM.setList(stringList);
        spinnerCovers.setModel(spinnerCoversM);
        spinnerCovers.fireUpdate();
    } else{
        stringList.clear();
        selectCoverFrame.dispose();
    }

}
}
}
4

2 に答える 2

0

これは複雑すぎると思います。JSpinner を拡張する必要はありません。

プログラムを開始するときは、JSpinner を作成する前に必ず値を追加してください。

    //create the list   
    stringList.add("a");
    stringList.add("b");
    stringList.add("c");
    stringList.add("d");

    //make sure you set the model to the list
    jSpinner.setModel(new javax.swing.SpinnerListModel(stringList));

次のようにイベントを作成する必要があります (何よりも先にこれを行います)。

    jSpinner.addChangeListener(new javax.swing.event.ChangeListener() {
        public void stateChanged(javax.swing.event.ChangeEvent evt) {
            stateChanged(evt);
        }
    });

メソッドは次のstateChanged(evt)ようになります。

    //Get selected item/object
    Object selected = jSpinner.getValue();
    //Remove selected item/object
    stringList.remove(selected);
于 2012-10-02T00:15:53.173 に答える