whichのブログ ~プログラミング体験記~ -7ページ目

whichのブログ ~プログラミング体験記~

主にJava,vVsual C#,Andoroid,SQLについて
覚え基本た文法やプログラミング技法、各クラスの利用法を
忘れないように形にしたものです

初心者だとかプロだとか特に意識せず利用してもらえるとうれしいです。

「ボタンをクリックする」、「チェックボックスにチェックを入れる」「キーボード入力する」、「マウス操作」などの部品操作を
イベント処理とGUIが実装できる言語では定義されている。

Java言語では発生したイベントごとに対応したメソッドが用意されている

基本イベントリスナー

イベントリスナー名インタフェイス名主な操作主な対応部品
actionPerformed(ActionEvent e)ActionListenerクリック、ダブルクリック、Enterキーボタンなど多数の部品が搭載
textValueChanged(TextEvent e)TextListenerテキスト変更変更テキストボックス
itemStateChanged(ItemEvent e)ItemListener選択、チェックするリスト、チェックボックス
adjustmentValueChanged(AdjustmentEvent e)AdjustmentListenerスクロール移動スクロールバー
windowStateChanged(WindowEvent e)WindowStateListenerウィンドウの状態遷移ウィンドウ、ダイアログ

これらインタフェイスは1メソッドだけなのでimplementsで実装するだけでよい。

ウィンドウ系イベントリスナー

インタフェイス名イベントリスナー名主な操作
windowListenerwindowOpened(WindowEvent e)ウィンドウが表示されたとき
windowClosing(WindowEvent e)ウィンドウを閉じる操作を開始したとき
windowClosed(WindowEvent e)ウィンドウを閉じ終えたとき
windowIconified(WindowEvent e)最小化したとき
windowDeiconified(WindowEvent e)最小化から通常サイズに戻したとき
対応部品 : あたりまえですがウィンドウ系のみ実装可能です。

フォーカスイベントリスナーとswing.eventパッケージのイベントリスナー

インタフェイス名イベントリスナー名主な操作
FocusListenerfocusGained(FocusEvent e)フォーカスを当てたとき
focusLost(FocusEvent e)フォーカスを離したとき
ListSelectionListenervalueChanged(ListSelectionEvent e)選択内容の変更
あとキーボード操作とマウス操作のイベントリスナーが残っていますが、この2つはイベントクラス(○○Event)である引数のオブジェクトで
用意されているパラメータの量が多いので後日とりあげます。

■○○Listenerと○○Adapterクラス
部品にイベントリスナーを登録(登録しないと何もおきない)するためメソッドがあり、
addActionListner(リスナー)のようにインタフェイス名(上記の3つの表参考)のまえに「add」が付いているメソッドである(これが有無使用可能かわかる)
ここで注意しなければいけないのは引数である。
引数:対応したインタフェイスを実装したクラスオブジェクト
つまり上記の1つ目の表のイベントだけなら「this」でもいいということになるしかし「MouseListener」と「KeyListener」と「FocusListener」と「windowListener」
は複数メソッドのインタフェイスである。
インタフェイスの性質上用意されているすべてのメソッドを実装しなければならない。
なのでいらないイベントも実装しなくてはならない。そのためインタフェイスを実装済みのアダプタークラスを継承したクラスオブジェクトで解決できる。
ただしGUIはJFrameをすでに継承しているので内部クラスを利用する。
記述例
public class MyMain extends JFrame{
      public MyMain(){
               JButton btn = new JButton();
               btn.addActionListener(new MyAdapter());
     }
     class MyAdapter extends KeyListener implemetsActionListener{  public void actionPerformed(ActionEvent e) { } }
}   
■無名クラス
イベント処理メソッド
イベントを発生したあと部品の情報を取得する。(この段階ではObject型)
取得したオブジェクトをそれぞれの部品にキャストして処理を実行
という流れだが当然 部品のごと処理を分ける処理も必要(クリックできる部品はたくさんあるため)
しかし部品とメソッドが1:1のときは無名クラスを使う
記述例
public class MyMain extends JFrame{
      public MyMain(){
               JButton btn = new JButton();
               btn.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent e) {  /*処理*/ } }  );
     }

awtで作成するときは終了オプションが用意されていなかったので無名クラスで定義していた。

■サンプル
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
public class GUIEvent extends JFrame{
TextField text1,text2;
JButton btn;
JLabel output;
JCheckBox check;
JTextArea area;
JComboBox combo;
JList list;
JScrollBar bar;
public static void main(String [] arge) { new GUIEvent(); }
public GUIEvent(){
final String [] list_item  = {"日本","イギリス","ロシア","アメリカ","フランス","ドイツ"};
final String [] combo_item = {"東京","名古屋","大阪","福岡","北海道","沖縄"};
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(600,390);
setTitle("JavaでGUIその3");
setLayout(new GridLayout(3,1));
JPanel center = new JPanel(new BorderLayout());
JPanel panel  = new JPanel(new GridLayout(2,1));
JPanel head   = new JPanel(new FlowLayout());
JPanel footer = new JPanel(new FlowLayout());
output = new JLabel("実行される部品を表示する             ");
btn    = new JButton("実行");
area   = new JTextArea("ここにログが表示されます",10,10);
bar    = new JScrollBar(JScrollBar.VERTICAL, 100, 20, 0, 1000);
list   = new JList(list_item);
combo  = new JComboBox(combo_item);
check  = new JCheckBox("チェック項目",false);
text1  = new TextField(7);
text2  = new TextField(7);
addWindowListener(new WindowAdapter(){
public void windowIconified(WindowEvent e){
setTitle("最小化");
}
public void windowDeiconified(WindowEvent e){
setTitle("JavaでGUIその3");
}
});
bar.addAdjustmentListener(new AdjustmentListener(){
public void adjustmentValueChanged(AdjustmentEvent e){
output.setText("スクロールバーを動かしました。          ");
area.setText(area.getText()+"\n AdjustmentEventが実行された");
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
btn.addActionListener(new ActionListener(){
public void actionPerformed(ActionEvent e){
output.setText("ボタンをクリックしました。            ");
area.setText(area.getText()+"\n ActionEventが実行された");
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
list.addListSelectionListener(new ListSelectionListener(){
public void valueChanged(ListSelectionEvent e){
int i = list.getSelectedIndex();
output.setText("JListで選択されている項目が変更されました     ");
area.setText(area.getText()+"\n ListSelectionEventが実行された:"+ list_item[i]);
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
combo.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent e){
output.setText("コンボボックスで選択されている項目が変更されました");
area.setText(area.getText()+"\n ItemEventが実行された:"+ combo.getSelectedItem());
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
check.addItemListener(new ItemListener(){
public void itemStateChanged(ItemEvent e){
String state;
if(check.isSelected()){
state = "チェックしました";
} else {
state = "チェックをはずしました";
}
output.setText("チェックボックスの選択が変更されました      ");
area.setText(area.getText()+"\n ItemEventが実行された:"+ state);
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
text1.addTextListener(new TextListener(){
public void textValueChanged(TextEvent e){
JTextField t = (JTextField)e.getSource();  
output.setText("テキストボックスの値が変更されました       ");
area.setText(area.getText()+"\n TextEventが実行された:" + t.getName());
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
text2.addTextListener(new TextListener(){
public void textValueChanged(TextEvent e){
JTextField t = (JTextField)e.getSource();  
output.setText("テキストボックスの値が変更されました       ");
area.setText(area.getText()+"\n TextEventが実行された:" + t.getName());
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
text1.addFocusListener(new FocusAdapter(){
public void focusGained(FocusEvent e){
output.setText("フォーカスが移動しました。            ");
area.setText(area.getText() + "\n FoucsEventが発生した");
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
text2.addFocusListener(new FocusAdapter(){
public void focusGained(FocusEvent e){
output.setText("フォーカスが移動しました。            ");
area.setText(area.getText() + "\n FoucsEventが発生した");
if(area.getRows()>30) area.setText("ここにログが表示されます");
}
});
center.add(area,BorderLayout.CENTER);
center.add(bar,BorderLayout.EAST);
panel.add(output);
panel.add(btn);
head.add(list);
head.add(combo);
head.add(check);
head.add(panel);
footer.add(new JLabel("入力1"));
footer.add(text1);
footer.add(new JLabel("入力2"));
footer.add(text2);
add(head);
add(center);
add(footer);
setVisible(true);
}
}

実行結果


今回は無駄に多種多様な部品を配置してすべて無名クラスでイベント実行させてみました。

次回は「JList」に挑戦します