• 締切済み

選択した項目を隣のリストへ移動

左のリストs1に表示された 都市名を選択してダブルクリックすると、 選択されている都市名を右のリストu1に移動して、配列citiesに格納された順に都市名をu1で表示するアップレットを作りたいのですが、移動した都市名が配列citiesに格納された順になりません。 選択した都市名が配列citiesで何番目かを調べて、それを変数jに格納して、jの値をもとに上から順に都市名を表示するようにしました。 改善点が分からないので、教えてください。 プログラムは以下の通り import java.awt.*; import java.applet.*; import java.awt.event.*; public class CityList extends Applet implements ActionListener{ List s1 = new List(12, true); //左側のリスト List u1 = new List(12, true); //右側のリスト String[] cities = {"札幌","仙台","千葉","横浜","川崎", "名古屋", "京都", "大阪", "神戸", "広島", "北九州", "福岡"}; public void init(){ for(int i = 0; i < cities.length; i++) s1.add(cities[i]); s1.addActionListener(this); add(s1); add(u1); } public void actionPerformed(ActionEvent e){ //配列citiesの添え字 int j; //左側のリストs1を,上から順に調べる for(int i = s1.getItemCount() - 1; i >= 0; i--){ //左側のリストs1で項目が選択されているかどうか if(s1.isIndexSelected(i)){ //配列citiesの添え字を0に初期化 j = 0; while(true){ //左側のリストs1で選択されている項目が, //配列citiesでは何番目かを調べる if(s1.getItem(i) == cities[j]) break; else j++; } //選択されている項目を,右側のリストu1に移動させる u1.add(s1.getItem(i), j); s1.remove(i); } repaint(); } } }

みんなの回答

  • teketon
  • ベストアンサー率65% (141/215)
回答No.2

そういったことではありません。 >配列citiesに格納された順に都市名をu1で表示する をしたいならば、u1の要素を、cities順に並び替える仕組みが必要です。 それを作ってください。 私だったら、s1をループの基準にするのではなく、citiesをループの基準にします。

  • teketon
  • ベストアンサー率65% (141/215)
回答No.1

>u1.add(s1.getItem(i), j); ここ。j番目に追加する際、u1の要素数がjより少ない場合、末尾に追加されてしまう。

参考URL:
http://e-class.center.yuge.ac.jp/jdk_docs/ja/api/java/awt/List.html#add(java.lang.String, int)
buzzard2415
質問者

補足

u1.add(s1.getItem(i), j); の直前に if(u1.getItemCount() - 1 < j) j = u1.getItemCount() - 1; を入れたのですが、ダメでした。 後は何を入れればいいですか?

関連するQ&A