TestFrm041ボタン操作に、次の機能を追加します。
それは、テキストフィールドtxt1の内容をJListの lst1に追加する機能です。
「変更して入力」のテキストフィールドを変更してボタンをクリックください。
ですがJListは、追加、挿入、削除を直接行う機能は持っていません。
JListの本質な機能は、オペレータに項目を見せて、選択させることです。
そして追加、挿入、削除を行わせるには別途にListModelインターフェイスクラス使い、
それに委任する形態で行われます。通常は、これを実装したDefaultListModelクラスを使います。
そこでまず、TestFrm041クラスに以下のフィールドを追加します。
そのイメージのクラス図を示します。
そして、TestFrm041クラスのコンストラクタで、
このlistModelをlst1に設定します。
ここで実験すると分かりますが、
setModelで、ListModelを設定することで
TestFrm04のリストへ設定した配列の文字列は無くなっています。
これは、以前からあるListModelを変更したためです。
この変更により、addメソッドによるリストへの追加が可能になります。
btn1クリックで、選択されているリスト項目位置を調べ、
選択されていないならリストの最後の位置(添え字)を調べ、
その位置へaddメソッドでテキストフィールドの文字列を追加しています。
これらリストの操作は、listModelを介してして行っています。それ以外にも、
削除クリア、など様々な命令が可能で、
このDefaultListModelクラスの機能の調べてみましょう。
package test; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.DefaultListModel; public class TestFrm041 extends TestFrm04 implements ActionListener { DefaultListModel listModel = new DefaultListModel(); public TestFrm041(){//コンストラクタ this.btn1.addActionListener(this);//クリックオブジェクトを指定 this.lst1.setModel(this.listModel); this.listModel.add(0, "abc");//先頭に追加挿入 this.listModel.add(1, "123 45");//1番目に追加挿入 this.listModel.add(2, "あいう");//2番目に追加挿入 } public void actionPerformed(ActionEvent e){ String s = this.txt1.getText();//txt1のテキストを取得 this.lbl1.setText("「" + s + "」を追加しました");//ラベルの文字列を設定 int idx = this.lst1.getSelectedIndex();//リスト選択項目の添え字取得 if(idx == -1){ idx = listModel.getSize();//サイズを返す。 } this.listModel.add(idx, s);//idxのリスト位置に追加挿入 } public static void main(String[] args){ new TestFrm041(); } }
リストにたくさん追加すると、項目が隠れてしまいます。
しかし、JListにはスクロールする機能がありません。
スクロール機能はJScrollPaneクラスオブジェクトに、
スクロールさせたいものを入れることで可能になります。
そこで、次のフィールドをTestFrm041クラスに追加します。
JScrollPane jscrollPan1;
そしてTestFrm04で配置したlst1を、コンテナから取り外して、
生成したJScrollPaneオブジェクトに入れた後、
そのJScrollPaneオブジェクトで
コンテナに入れ直します。(lst1とjscrollPan1を入れ替えたとことになります)
そして、入れ直しの表示を行わせるために、
コンテナ内のサブコンポーネントを配置するvalidateメソッドを実行しています。
(このように可視状態後にコンテナの内容を変更した場合は、
最後にvalidateメソッドを実行させる必要があります。)
これら変更を行ったクラス図と、追加したTestFrm041.javaのコードを示します。
package test; import java.awt.Container; import java.awt.event.ActionListener; import java.awt.event.ActionEvent; import javax.swing.DefaultListModel; import javax.swing.JScrollPane; public class TestFrm041 extends TestFrm04 implements ActionListener { DefaultListModel listModel = new DefaultListModel(); JScrollPane jscrollPan1;//スクロールペイン public TestFrm041(){//コンストラクタ this.btn1.addActionListener(this);//クリックオブジェクトを指定 Container container = getContentPane(); container.remove(this.lst1);//lst1をコンテナから取り外す this.jscrollPan1 = new JScrollPane(this.lst1);//リストを入れて生成 container.add(this.jscrollPan1, java.awt.BorderLayout.WEST);//lst1が入ったjscrollPan1で、入れ直す。 this.lst1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); this.validate(); //コンテナ内のサブコンポーネントを配置 this.lst1.setModel(this.listModel); this.listModel.add(0, "abc");//先頭に追加挿入 this.listModel.add(1, "123 45");//1番目に追加挿入 this.listModel.add(2, "あいう");//2番目に追加挿入 } public void actionPerformed(ActionEvent e){ String s = this.txt1.getText();//txt1のテキストを取得 this.lbl1.setText("「" + s + "」を追加しました");//ラベルの文字列を設定 int idx = this.lst1.getSelectedIndex();//リスト選択項目の添え字取得 if(idx == -1){ idx = listModel.getSize();//サイズを返す。 } this.listModel.add(idx, s);//idxのリスト位置に追加挿入 } public static void main(String[] args){ new TestFrm041(); } }
上記に this.lst1.setSelectionMode(javax.swing.ListSelectionModel.SINGLE_SELECTION); の記述がありますが、
これによりリスト項目単体だけしか選択できないモードに変更されています。
デフォルトのはモード自由にリスト項目を選択できるモードです。
(これは、Ctrlを押しながらのクリックで可能です。
先頭の【最初の目標プログラム実行】ボタンで実行するフレームのリスト操作と
比較ください。
なお、JListの選択モードは3通りあってもう一つは、
『連続項目だけ複数選択状態にできる』モードです。)
「変更して入力」のテキストフィールドを変更してボタンをクリックください。
テキストエリアで、キー入力を続けると、エリア内だけで表示できなくなります。
そこでテキストエリアもスクロールできるように変更しします。
つまりスクロール機能のJScrollPaneクラスオブジェクトに、
スクロールさせたいテキストエリアを入れるわけです。
そこで、次のフィールドをTestFrm041クラスに追加します。
JScrollPane jscrollPan2;
そしてTestFrm04で配置したtxtArea1を、コンテナから取り外して、
生成したJScrollPaneオブジェクトに入れた後、
そのJScrollPaneオブジェクトでコンテナに入れ直します。
テキストエリアのスクロールを確認ください。
これら変更を行ったクラス図を以下に示します。
以下にそのコードを示します。■■■■の部分を正しく直しましょう。
←正しく修正してからクリックください。
←わからない場合は、クリック