last modified: Jun./30th/2002; Jan./22nd/2002
前節でイベント処理の基本を紹介しました。そこでは、イベント処理の為に、イベントが発生するボタンをインスタンス化するパネルを別のクラスにして、イベント・リスナーを実装しました。
イベントリスナーを別のクラスに分離して実装してみます。GUI アプリケーションとしては、金額を入力してボタンを押すと、5%加算された値が表示されるようにします。
![]() |
図:TaxCalcuration の実行結果 |
import java.awt.*; import java.awt.event.*; import javax.swing.*; class TaxCalcuration { public static void main(String[] args) { JFrame frame = new JFrame("Tax Calcuration"); MyCalcurationPanel panel = new MyCalcurationPanel(); Container cont = frame.getContentPane(); cont.add(panel); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class MyCalcurationPanel extends JPanel { JButton submit, reset; JTextField amount, result; MyCalcurationPanel() { // eh オブジェクトに自分自身を登録 EventHandler eh = new EventHandler(this); JPanel head = new JPanel(); JPanel center = new JPanel(); result = new JTextField(10); amount = new JTextField("0", 10); result.setHorizontalAlignment(JTextField.RIGHT); amount.setHorizontalAlignment(JTextField.RIGHT); submit = new JButton("計算"); reset = new JButton("リセット"); head.add(amount); center.add(submit); center.add(reset); this.setLayout(new BorderLayout()); this.add(head, BorderLayout.NORTH); this.add(center, BorderLayout.CENTER); this.add(result, BorderLayout.SOUTH); // イベントを eh オブジェクトに放る submit.addActionListener(eh); reset.addActionListener(eh); } } class EventHandler implements ActionListener { MyCalcurationPanel panel; EventHandler (MyCalcurationPanel mpanel) { panel = mpanel; } public void actionPerformed(ActionEvent ae) { if (ae.getSource() == panel.submit) { int i = Integer.parseInt(panel.amount.getText()); double d = i * 1.05; int j = (int)d; panel.result.setText(String.valueOf(j)); } else if (ae.getSource() == panel.reset) { panel.amount.setText("0"); panel.result.setText("0"); } } }
実行結果:
C:\java>javac TaxCalcuration.java C:\java>java TaxCalcuration
上の例ではイベント処理を別のクラスに分けました。多くの場合では、イベント処理を他のクラスに分ける場合、内部クラスとして実装します。
InnerTaxCalcuration.java
:
import java.awt.*; import java.awt.event.*; import javax.swing.*; class InnerTaxCalcuration { public static void main(String[] args) { JFrame frame = new JFrame("Tax Calcuration"); MyCalcurationPanel panel = new MyCalcurationPanel(); Container cont = frame.getContentPane(); cont.add(panel); frame.pack(); frame.setVisible(true); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } } class MyCalcurationPanel extends JPanel { JTextField amount, result; JButton submit, reset; MyCalcurationPanel() { // 内部クラスのインスタンス化 InnerEventHandler eh = new InnerEventHandler(); JPanel head = new JPanel(); JPanel center = new JPanel(); result = new JTextField(10); amount = new JTextField("0", 10); result.setHorizontalAlignment(JTextField.RIGHT); amount.setHorizontalAlignment(JTextField.RIGHT); submit = new JButton("計算"); reset = new JButton("リセット"); head.add(amount); center.add(submit); center.add(reset); this.setLayout(new BorderLayout()); this.add(head, BorderLayout.NORTH); this.add(center, BorderLayout.CENTER); this.add(result, BorderLayout.SOUTH); // イベントを eh オブジェクトに放る submit.addActionListener(eh); reset.addActionListener(eh); } // 内部クラスによるイベントリスナー class InnerEventHandler implements ActionListener { public void actionPerformed(ActionEvent ae) { if (ae.getSource() == submit) { int i = Integer.parseInt(amount.getText()); double d = i * 1.05; int j = (int)d; result.setText(String.valueOf(j)); } else if (ae.getSource() == reset) { amount.setText("0"); result.setText("0"); } } } }
実行例:
C:\java>javac InnerTaxCalcuration.java C:\java>java TaxCalcuration
実行例は上のサンプルと同じです。