ListのItemListenerについて

このQ&Aのポイント
  • ListのItemListenerを使用して、選択したタイトルの画像を表示するプログラムを作成する方法について教えてください。
  • ChoiceからListの内容を書き換え、さらにListから下部へ画像を表示する方法について教えてください。
  • 具体的なコードが記載されており、要点が分かりやすい解説がある質問です。
回答を見る
  • ベストアンサー

ListのItemListenerについて

50音のリストから選択したタイトルの画像を表示するようなプログラムを作ろうと思っているのですが、ItemListenerの2種類以上の使い方?が分かりません。 左側のChoiceからListの内容は書き換えることが出来たのですが、真ん中のListから右のListを書き換え、更には右のListから下部へ画像を表示させたいのです。 この場合どのように記入すればいいのか教えてください。お願いします。 以下拙いですが自分の書いた部分です import java.applet.Applet; import java.awt.*; import java.awt.event.*; public class Test extends Applet implements ItemListener{ Panel p[]=new Panel[1]; Choice c1; String s[]={"あ","い","う","え","お","か","き","く","け","こ", "さ","し","す","せ","そ","た","ち","つ","て","と", "な","に","ぬ","ね","の","は","ひ","ふ","へ","ほ", "ま","み","む","め","も","や","ゆ","よ","","", "ら","り","る","れ","ろ","わ","","","","",}; List lst1,lst2; int i; public void init() { p[0]=new Panel(new GridLayout(1,3)); c1=(Choice)p[0].add(new Choice()); for (i=0;i<50;i=i+5) c1.add(s[i]+"行"); c1.addItemListener(this); lst1=(List)p[0].add(new List(5)); lst1.add(s[0]); lst1.add(s[1]); lst1.add(s[2]); lst1.add(s[3]); lst1.add(s[4]); lst1.addItemListener(this); lst2=(List)p[0].add(new List(5)); lst2.addItemListener(this); add(p[0]); } public void itemStateChanged(ItemEvent e){ Choice c1=(Choice)e.getSource(); String str=(String)c1.getSelectedItem(); if(str.equals("あ行")){ lst1.removeAll(); for(i=0;i<5;i++){ lst1.add(s[i]); } lst2.removeAll(); } else if(str.equals("か行")){ lst1.removeAll(); for(i=5;i<10;i++){ lst1.add(s[i]); } lst2.removeAll(); } 以下わ行まで書いてあります } public void destroy() { } }

  • koe_s
  • お礼率50% (1/2)
  • Java
  • 回答数2
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • yamada_g
  • ベストアンサー率68% (258/374)
回答No.1

AWTは全然さわったことが無いのですが、やり方は複数あるようです。 itemStateChanged()の中でイベントの発生元を判別し処理を分岐する Object source = e.getSource(); if (source == c1) {  //処理 } else if (source == lst1) {  //処理 } インナークラスを利用する private C1Listener implements ItemListener {  public void itemStateChanged(ItemEvent e) {   //処理  } } c1.addItemListener(new C1Listener()); 匿名クラスを利用する c1.addItemListener(new ItemListener() {  public void itemStateChanged(ItemEvent e) {   //処理  } } などです。 参考URLなども読んで見て、ご自身に合ったやり方を選べばいいと思います。

参考URL:
http://nextindex.jp/java/applet/awt/eventSummary.html
koe_s
質問者

お礼

迅速な回答を頂いたにもかかわらずお礼のほう遅れて申し訳ありません。 参考URL込みでとても分かりやすく、悩んでいた部分が解決しました! 本当にありがとうございました。

その他の回答 (1)

  • askaaska
  • ベストアンサー率35% (1455/4149)
回答No.2

Appletを継承したクラス(今回はTestクラス)に Listenerをimplementsするのではなく、 画面の各部品にListenerを実装するようにすればいいのよ。

関連するQ&A

  • java通信について

    アプレットビューアは 通信成功できますが HTMLから実行すると失敗します so = new Socket( "localhost", 80 ); この部分が失敗してるようです なぜ起こるんでしょうか ? 解決方法を教えてください。 //html <html><body> <applet code = "a.class" width = "370" height ="530"></applet> </body></html>   //<applet code = "a.class" width="400" height = "200"></applet> import java.awt.*; import java.awt.event.*; import java.io.*; import java.net.*; public class a extends java.applet.Applet implements ActionListener{ TextField tf; Button b; TextArea t; Panel p, p1; String str = "http://localhost/cgi-bin/a.cgi"; public void init(){ tf = new TextField( 32 ); b = new Button( "Post" ); t = new TextArea( 20, 48 ); b.addActionListener( this ); p = new Panel(); p.add( new Label( "String" ) ); p.add( tf ); p.add( b ); p1 = new Panel(); p1.add( t ); add( p ); add( p1 ); } public void actionPerformed( ActionEvent e ){ String str; if( e.getSource() == b ){ t.setText( sen( tf.getText() ) ); } } private String sen( String a ){   Socket so = null; InputStreamReader in = null; OutputStream os = null; String str1 = new String(); try { t.setText( "aa" ); so = new Socket( "localhost", 80 ); t.setText( "bb" ); in = new InputStreamReader( so.getInputStream() ); os = so.getOutputStream(); }catch( Exception e ){ return "Error!"; } String H = "POST " + str + " HTTP/1.0\n"; H += "Content-Length:" + String.valueOf( a.length() ) + "\n\n"; String st = new String( H + a ); try{ os.write( st.getBytes() ); }catch( Exception e ){ return "Error!"; } str1 = "Send:\n" + st; boolean bo = true; StringBuffer sb = new StringBuffer(); int s; while( bo ){ try{ s = in.read();   if( s == -1 ) bo = false; else sb.append( (char)s ); }catch( Exception e ){ bo = false; } } str1 += "\nResv:\n" + sb.toString(); return str1; } }

    • ベストアンサー
    • Java
  • すいません。解説してください。

    いつも教えて頂き大変お世話になっております。 下記プログラムを解説して頂きたいのです。 特に最初の4行を詳しく教えて欲しいです。 何度もすみません。 ご回答のほど、宜しくお願い申し上げます。 OSはUbuntu18.04を使っています。 このプログラムは、他のプログラムも関係するのでしょうか? 色々とお手数かけます。 コンパイルしたら注意:Sample90.javaの操作は、未チェックまたは安全ではありません。とエラーメッセージが出ました。 何でも参考になります。 ご回答のほど、宜しくお願い申し上げます。 package sample; import java.util.List; import java.util.ArrayList; import java.util.LinkedList; public class Sample90 { public static void main(String[] args) { new Sample90().execute(); } public void execute() { List list = new ArrayList(); list.add("A"); list.add("B"); for (int i = 0; i < list.size(); i++) { String s = (String) list.get(i); System.out.print(s + " "); } System.out.println(""); list = new LinkedList(); list.add("A"); list.add("B"); for (int i = 0; i < list.size(); i++) { String s = (String) list.get(i); System.out.print(s + " "); } } }

  • エラーで式の開始が不正ですと出ます。

    質問内容 課題 ・ファイル student.txt に学生データ(学籍番号、氏名、所属学部)が入っている。 ・半角文字で学籍番号を入れて、検索ボタンを押すと、氏名と学部が表示される。 ・存在しない学籍番号を入れて、検索ボタンを押すと、「該当なし」が表示される。 ・ファイル student.txt の内容。  学籍番号 氏名 学部の間は半角スペースで区切る。 0521201 金城花子 文学部 0533101 守山春子 生活環境学部 0561101 大森夏子 人間科学部 0552130 名城秋子 現代文化学部 0571201 鶴舞冬子 薬学部 プログラムソース↓ import java.awt.*; import java.awt.event.*; import javax.swing.*; import java.io.*; class kadai2Frame extends JFrame { private JTextField tf1,tf2,tf3; public kadai2Frame() { setSize(200,100); addWindowListener(new WindowAdapter() { // ×クリック時の終了処理 public void windowClosing(WindowEvent e) { System.exit(0); } }); Container c=getContentPane(); c.setLayout(new GridLayout(4,2)); // グリッドレイアウト4 行2 列を指定 c.add(new JLabel("学籍番号")); // 最初のラベルを作成して[名前]と表示 c.add(tf1=new JTextField("",8)); c.add(new JLabel("氏名")); // 最初のラベルを作成して[名前]と表示 c.add(tf2=new JTextField("",8)); c.add(new JLabel("学部")); // 次のラベルを作成して[年齢]と表示 c.add(tf3=new JTextField("",8)); JButton bt; c.add(bt=new JButton("検索")); // ボタンbt を作成して[検索]と表示 bt.addActionListener(new ActionListener() { // ボタンbt のリスナーを登録 public void actionPerformed(ActionEvent e) { // ボタンが押された時 string s6 = tf1.getText(); if(s1.equals(s6)){tf2.setText(str1Ary[1]); string s6 = tf1.getText(); if(s2.equals(s6)){tf2.setText(str2Ary[1]); string s6 = tf1.getText(); if(s3.equals(s6)){tf2.setText(str3Ary[1]); string s6 = tf1.getText(); if(s4.equals(s6)){tf2.setText(str4Ary[1]); string s6 = tf1.getText(); if(s5.equals(s6)){tf2.setText(str5Ary[1]); } public static void main(String[] args) { JFrame w=new kadai2Frame(); w.setVisible(true); try{ BufferedReader br = new BufferedReader(new FileReader("student.txt")); } catch (FileNotFoundException e) { String str1 = br.readLine(); String str2 = br.readLine(); String str3 = br.readLine(); String str4 = br.readLine(); String str5 = br.readLine(); String[] str1Ary = str1.split(" "); for (int i=0; i<str1Ary.length; i++) { System.out.println(str1Ary[i]); } String[] str2Ary = str2.split(" "); for (int i=0; i<str2Ary.length; i++) { System.out.println(str2Ary[i]); } String[] str3Ary = str3.split(" "); for (int i=0; i<str3Ary.length; i++) { System.out.println(str3Ary[i]); } String[] str4Ary = str4.split(" "); for (int i=0; i<str4Ary.length; i++) { System.out.println(str4Ary[i]); } String[] str5Ary = str5.split(" "); for (int i=0; i<str5Ary.length; i++) { System.out.println(str5Ary[i]); } String s1 = "str1Ary[0]"; String s6 = "tf1"; String s2 = "str2Ary[0]"; String s3 = "str3Ary[0]"; String s4 = "str4Ary[0]"; String s5 = "str5Ary[0]"; } } }); } } 以上です。誰か教えてください!!(ToT)

    • ベストアンサー
    • Java
  • 選択した項目を隣のリストへ移動

    左のリスト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(); } } }

  • Javaアプレットについてですが

    Javaアプレットでボタンを押したら数字が増えるものを作っているのですがどうもうまく動きません。 ソースは下の通りです。 変更しなければいけないところがあるならお願いします。 import java.applet.Applet; import java.awt.Graphics; import java.awt.Button; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; public class Sample7 extends Applet implements Runnable, ActionListener { Button bt; int num; public void init() { bt = new Button("開始"); add(bt); bt.addActionListener(this); Thread th; th = new Thread(this); th.start(); } public void actionPerformed(ActionEvent ae) { public void run() { try{ for(int i=0; i<11; i++){ num = i; repaint(); Thread.sleep(1000); } } catch(InterruptedException e){} } } public void paint(Graphics g) { String str = num + "です。"; g.drawString(str, 50, 50); } }

    • ベストアンサー
    • Java
  • java applet

    import java. applet.*; import java. awt. Button; import java. awt. Label; import java. awt. TextField; import java. awt. event.*; public class 1120 extends Applet implements ActionListener { private TextField box1 = new TextField(5); private TextField box2 = new TextField(5); private TextField box3 = new TextField(5); private Label moji1 = new Label(" と "); private Label moji2 = new Label(" の和は "); private Label moji3 = new Label(" である。 "); private Button ok = new Button("OK"); public void init() { resize( 320 , 240); add( box1 ); add( moji1 ); add( box2 ); add( moji2 ); add( box3 ); add( moji3 ); add( ok ); ok.addActionListener( this ); } public void actionPerformed( ActionEvent e ) { int i=0 ,j =0 , k; String t1 = box1.getText(); String t2 = box2.getText(); i = Integer.parseInt( t1 ); j = Integer.parseInt( t2 ); k = i + j; String s = Integer.toString( k ); box3. setText( s ); } } //上記のプログラムを書いたのですが、なぜかエラーが出てしまいます。勿論、自分でも見直しましたが、その理由がわかりませんでした。知識のある方、ご回答の方お願いします。

  • 一桁電卓(setText)

    //<applet code="Calc.class" width="250" height="150" ></applet> import javax.swing.*; import java.awt.*; import java.awt.event.*; public class Calc extends JApplet implements ActionListener{ JTextField display; int row=4,column=4,value=0,d; char str,str2; JButton[][] button=new JButton[row][column]; String[][] buttonName={{"7","8","9","/"}, {"4","5","6","*"}, {"1","2","3","-"}, {"0","C","=","+"}}; public void init(){ Container pane=getContentPane(); JPanel panel=new JPanel(); panel.setLayout(new GridLayout(4,4)); display=new JTextField(String.valueOf(value)); pane.add(display); display.setHorizontalAlignment(JTextField.RIGHT); display.setEditable(false); for(int a=0;a<row;a++){ for(int b=0;b<column;b++){ button[a][b]=new JButton(buttonName[a][b]); panel.add(button[a][b]); button[a][b].addActionListener(this); } } pane.add(panel,BorderLayout.SOUTH); } public void setText(int c){ if(str2!='/'&&str2!='*'&&str2!='-'&&str2!='+'){ value=c; } else if(str=='='){ display.setText(String.valueOf(value)); } if(str!='/'&&str!='*'&&str!='-'&&str!='+'&&str!='='){ display.setText(String.valueOf(c)); if(str2=='/')value=value/c; if(str2=='*')value=value*c; if(str2=='-')value=value-c; if(str2=='+')value=value+c; } else{ display.setText(String.valueOf(value)); if(str2=='/')value=value/c; if(str2=='*')value=value*c; if(str2=='-')value=value-c; if(str2=='+')value=value+c; } } public void actionPerformed(ActionEvent e){ for(int i=0;i<4;i++){ for(int j=0;j<4;j++){ if(e.getSource()==button[i][j]){ str=buttonName[i][j].charAt(0); switch(str){ case '/': str2=str; setText(1); break; case '*': str2=str; setText(1); break; case '-': str2=str; setText(0); break; case '+': str2=str; setText(0); break; case '=': setText(d); break; case 'C': str2=str; value=0; setText(value); break; default: d=Integer.parseInt(buttonName[i][j]); setText(d); break; } } } } } } 上のプログラムは一桁電卓です。 プログラムは思ったように動くんですが、 seText(0、または1)の部分がどういう役目を果たしているか、0と1でどう違ってくるのかが分かりません。できればsetText(char)の説明も交えて教えていただけませんか?

  • 2つのリストのマージ方法について

    2つのリストのマージ方法について 下記の要件を満たしたいと考えています。 ・リスト1・2をkeyをキーにマージしたい。  リスト1[0]:key=2, value1=b  リスト1[1]:key=3, value1=d  リスト1[2]:key=4, value1=e  ・  ・  ・  リスト2[0]:key=1, value2=A  リスト2[1]:key=2, value2=B  リスト2[2]:key=5, value2=F  リスト2[3]:key=6, value2=G  ・  ・  ・  ↓  リスト3[0]:key=1, value1=A, value=""  リスト3[1]:key=2, value1=b, value=B  リスト3[2]:key=3, value1=d, value=""  リスト3[3]:key=4, value1=e, value=""  リスト3[4]:key=5, value1="", value=F  リスト3[5]:key=6, value1="", value=G  ・  ・  ・ ・リスト1・2はkeyの昇順でソート済。各リスト内では重複しているkeyはない。 ・マージ後もkeyの昇順にしたい。 ・実際のリストはそれぞれ数万件~数十万件なので、パフォーマンスを考慮したい。 下記のように作成してみたのですが、無理やりやりました感があり、分かりづらくバグがありそうです。またループでnewもしてたりしてパフォーマンスも悪そうです。もっとスマートにパフォーマンスもよい方法がないでしょうか? int checkedCount = 0; for (int i = 0; i < list1.size(); i++) { String str1 = list1.get(i).get("key"); for (int j = checkedCount; j < list2.size(); j++) { Map<String, String> map3 = new HashMap<String, String>(); String str2 = list2.get(j).get("key"); if (str1.compareTo(str2) < 0) { if (i != list1.size() - 1) { map3.put("key", str1); map3.put("value1", list1.get(i).get("value1")); map3.put("value2", ""); list3.add(map3); break; } else { Map<String, String> map4 = new HashMap<String, String>(); map4.put("key", str2); map4.put("value1", ""); map4.put("value2", list2.get(j).get("value2")); list3.add(map4); } } else if (str1.compareTo(str2) == 0) { map3.put("key", str1); map3.put("value1", list1.get(i).get("value1")); map3.put("value2", list2.get(j).get("value2")); list3.add(map3); checkedCount = j + 1; break; } else { map3.put("key", str2); map3.put("value1", ""); map3.put("value2", list2.get(j).get("value2")); list3.add(map3); checkedCount = j + 1; } } }

    • ベストアンサー
    • Java
  • Javaの課題について質問です。パート(1)

    1ヶ月前に出されたjavaの課題でどうしてもわからなく投稿させて頂きました。正直自分の力で解決するべきだと思いますが初めてjavaに触れるので全く分からず投稿しました、どうかご教授下さい。  コンパイルしたのですが01,06,99以外の処理に全てエラーが出てしまいます。07,08に関しては最初の頭の数で昇順、降順されてしまいます。。 実行クラスはパート(2)に載せます。 import java.util.ArrayList; public class A21_StrArray { ArrayList<String> list = new ArrayList<String>(); public void add(String data){    //要素追加 list.add(data); } public void set(int index, String data){   //指定インデックスがない場合エラー list.set(index,data); } public String get(int index) throws IndexOutOfBoundsException{   //指定インデックスがない場合エラー String str; str = list.get(index);//指定文字列を取得 return str; } public void clear(){  //要素クリア list.clear(); } } import java.util.Collections; public class A22_StrArray extends A21_StrArray{ public String[] getAll(){ String[] all = new String[list.size()]; //全ての要素を配列で取得 for(int i=0; i<list.size(); i++){ all[i] = super.get(i); } return all; } public int getIndex(){      //要素数を取得 int item; item = list.size(); return item; } public static final int ASC_SORT = 0; //昇順ソート public static final int DESC_SORT = 1;   //降順ソート public void sort(int mode){           //引数 mode ASC_SORT, DESC_SORT if(ASC_SORT == mode){ Collections.sort(list); } else if(DESC_SORT == mode){ Collections.reverse(list); } } } 以下ファイルの引数は全てpath import java.io.BufferedReader; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class A23_StrArray extends A22_StrArray{ public void readFile(String path)throws Exception{ try{ FileReader in1 = new FileReader("path"); //テキストファイルの読み込み(上書きモード) int ch; while ((ch = in1.read()) != -1){ System.out.print(Integer.toHexString(ch) + " "); } in1.close(); }catch (IOException e) { System.out.println(e); } } public void readFile(String path , boolean modeAdd)throws Exception{ //テキストファイルの読み込み(追記/上書きモード) try { BufferedReader br1 = new BufferedReader(new FileReader(path)); String str1 ; if(modeAdd == true){ while ((str1 = br1.readLine()) != null) { list.add(str1); } br1.close(); } if ( modeAdd == false){ list.clear(); while ((str1 = br1.readLine()) != null){ list.add(str1); } br1.close(); } }catch (IOException e){ System.out.println(e); } } public void writeFile(String path)throws Exception{ //テキストファイルの書き込み(上書きモード) try{ FileWriter wr1 = new FileWriter("path"); String str2 = null ; wr1.write(str2); wr1.close(); }catch (IOException e) { System.out.println(e); } } public void writeFile(String path,boolean modeAdd)throws Exception{   //テキストファイルの書き込み(追記/上書きモード) try{ BufferedReader br2 = new BufferedReader(new FileReader(path)); String str3 ; if(modeAdd == true){ while ((str3 = br2.readLine()) != null) { list.add(str3); } br2.close(); } if(modeAdd == false){ list.clear(); while ((str3 = br2.readLine()) != null){ list.add(str3); } br2.close(); } }catch (IOException e) { System.out.println(e); }      } }

  • Listからのnull要素を削除方法は?

    次のリストに入っているnull要素を削除する方法をお教え下さい。  List<String> lst = new ArrayList<String>(); while (lst.remove(null)); や for (int i=0; i < lst.size();i++) {  if (lst.get(i) == null ) lst.remove(i); } ではException in thread "main" java.lang.UnsupportedOperationException が起こります。 2011 Nov. 27.

    • ベストアンサー
    • Java

専門家に質問してみよう