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();
}
}
}
}