オブジェクト指向プログラミング演習 課題 20071128
以下のような GUI 画面を表示するプログラムを完成させなさい。 前回演習で作成したプログラムにイベント処理を追加します。 注意:ファイル名が同じものがあるので、課題毎にディレクトリーを分ける等してください。■課題 20071128_01
講義資料内で紹介したイベント処理の例2を作成し、動作を確認せよ。 (1)コントロールクラス(main メッソドを含むクラス)は、Kadai20071128_01 とし、以下のようなものとする。 /** 課題 20071128_01 Kadai20071128_01.java コントロールクラス */public class Kadai20071128_01 {
public static void main(String[] args) {
TaxCalc frame = new TaxCalc("Tax Calculator");
} } (2)フレームのクラス名は TaxCalc とし、講義資料に基き作成しなさい。(イベント処理の例1のイベントリスナーの登録部分を変更する。) (3)イベントリスナーのクラス名は EventHandler とし、講義資料に基き作成しなさい。
■課題 20071128_02(簡易レジスター)
概略仕様: 1.フレーム内にはパネルが4つあり、レイアウトは GridLayout(4, 1)(4行1列のレイアウト)とする。 2.一つ目のパネル内には、ラベル(“製品名”と左寄せ表示)とテキストフィールド(サイズは 10 桁)があり、レイアウトは FlowLayout()と する。 3.二つ目のパネル内には、ラベル(“個数”と左寄せ表示)とテキストフィールド(サイズは 10 桁)があり、レイアウトは FlowLayout()とす る。 4.三つ目のパネル内にはボタンが二つ(それぞれのラベルを“追加”“合計”とする)あり、レイアウトは FlowLayout()とする。 5.四つ目のパネル内には、ラベル(“合計金額”と左寄せ表示)とテキストフィールド(サイズは 10 桁)があり、レイアウトは FlowLayout() とする。 (以上が前回作成したプログラム) 6.ボタン“追加”“合計”のそれぞれにアクションリスナーを登録する。 7.ボタン“追加”に対応したアクションリスナークラス AddListener を作成する。このクラスは、ボタンが押される度に“製品名”に付随す るテキストフィールド内の文字列に対応する製品と“個数”に付随するテキストフィールド内の(文字列を整数に変換した)数字のペアを ProductCountList クラス型の変数に順次登録してゆく。(製品名は、“SeihinA”、“SeihinB”、“SeihinC”の3種類。) 8.ボタン“合計” に対応したアクションリスナークラス SumListener を作成する。このクラスは、ProductCountList クラス型の変数に登録され ている製品名と個数を順次取り出し、PriceList クラスに問い合わせる(getPrice メッソドを使用する)ことによって製品名からその価格を得 た後に、価格×個数の総和を計算し、その値を“合計金額”に付随するテキストフィールドに書き込む。9.ProductCountList クラスは、ArrayList クラスのフィールド(メンバー変数)等を持つ。ArrayList の要素は ProductCount クラスであり、ProductCount クラスは、String 型フィールド(メンバー変数)product と int 型フィールド(メンバー変数)count 等を持つ。
10.PriceList クラスは、ArrayList クラスのフィールド(メンバー変数)等を持つ。ArrayList の要素は ProductPrice クラスであり、ProductPrice ク ラスは、String 型フィールド(メンバー変数)product と int 型フィールド(メンバー変数)price 等を持つ。
(1)コントロールクラス(main メッソドを含むクラス)は、Kadai20071128_01 とし、以下のようなものとする。 /** 課題 20071128_02 Kadai20071128_02.java コントロールクラス */
public class Kadai20071128_02 {
public static void main(String[] args) {
MyFrame frame = new MyFrame("Kadai20071128_02");
} } (2)フレームのクラス名は MyFrame とし、以下のようなものとする。 /** 課題 20071128_02 MyFrame.java フレーム */ import java.awt.*; import javax.swing.*;
public class MyFrame {
private JFrame frame;
private JPanel panel1;
private JPanel panel2;
private JPanel panel3;
private JPanel panel4;
private JLabel label1;
private JTextField text1;
private JLabel label2;
private JTextField text2;
private JButton button1;
private JButton button2;
private JLabel label4;
private JTextField text4;
// private JMenuItem menuitem; 後日の演習で使用する予定 private ProductCountList pcl = new ProductCountList();
MyFrame(String title) {
// JFrame インスタンス化 frame = new JFrame(title);
// JPanel のインスタンス化(一つ目) panel1 = new JPanel();
panel2 = new JPanel();
panel3 = new JPanel();
panel4 = new JPanel();
// コンポーネントのインスタンス化
label1 = new JLabel("製品名", JLabel.LEFT); text1 = new JTextField(10);
label2 = new JLabel("個数", JLabel.LEFT); text2 = new JTextField(10);
button1 = new JButton("追加");
button2 = new JButton("合計");
label4 = new JLabel("合計金額", JLabel.LEFT); text4 = new JTextField(10);
// レイアウトマネージャー(FlowLayout を使用) panel1.setLayout(new FlowLayout()); // コンポーネントの追加 panel1.add(label1); panel1.add(text1); // レイアウトマネージャー(FlowLayout を使用) panel2.setLayout(new FlowLayout());
// コンポーネントの追加 panel2.add(label2); panel2.add(text2); // レイアウトマネージャー(FlowLayout を使用) panel3.setLayout(new FlowLayout()); // コンポーネントの追加 panel3.add(button1); panel3.add(button2); // レイアウトマネージャー(FlowLayout を使用) panel4.setLayout(new FlowLayout()); // コンポーネントの追加 panel4.add(label4); panel4.add(text4); // ActionListener を追加
AddListener al = new AddListener(text1, text2, pcl);
button1.【 1 】(al);
SumListener sl = new SumListener(text4, pcl);
button2. 【 1 】(sl);
// JFrame のコンテントペインを取得
Container con = frame.getContentPane();
// レイアウトマネージャー(GridLayout を使用) con.setLayout(new GridLayout(4, 1)); // パネルの追加 con.add(panel1); con.add(panel2); con.add(panel3); con.add(panel4); // 後日の演習でここにメニュー及びその ActionListener の追加を行う予定 // JFrame のセットアップ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } } (3)ボタン“追加”に対応したアクションリスナークラスを作成する。 /** 課題 20071128_02 AddListener.java Add Button に対するイベントリスナー */ import java.awt.*; import javax.swing.*; import java.awt.event.*;
public class AddListener implements 【 2 】 { private JTextField text1;
private JTextField text2;
private ProductCountList pcl;
AddListener(JTextField text1, JTextField text2, ProductCountList pcl) {
this.text1 = text1;
this.text2 = text2;
this.pcl = pcl;
}
public void 【 3 】(ActionEvent e) { try { pcl.setProductCount(text1.getText(), Integer.parseInt(text2.getText())); } catch( NumberFormatException ex ) { } } } (4)ボタン“合計”に対応したアクションリスナークラスを作成する。 /** 課題 20071128_02 SumListener.java Sum Button に対するイベントリスナー */ import java.awt.*; import javax.swing.*; import java.awt.event.*;
public class SumListener implements 【 2 】 { private JTextField text;
private ProductCountList pcl;
SumListener(JTextField text, ProductCountList pcl) {
this.text = text;
this.pcl = pcl;
}
public void 【 3 】(ActionEvent e) { int totalPrice = 0;
PriceList pl = new PriceList();
for( int i = 0; i < pcl.size(); i++ ) {
ProductCount pc = pcl.getProductCount(i);
String seihin = pc.getProduct();
int kosu = pc.getCount();
totalPrice += pl.getPrice(seihin)*kosu; } text.setText(Integer.toString(totalPrice)); } } (5)その他のクラス(4つある)は以下のようになる。クラスは完成しているので、そのままコピー&ペーストして使用して良い。 /** 課題 20071128_02 ProductCountList.java 製品(product)の個数のリスト */ import java.util.*;
public class ProductCountList {
private ArrayList<ProductCount> pcl = new ArrayList<ProductCount>();
public int size() {
return pcl.size();
}
if( (0 <= index) && (index < pcl.size()) ) { return (ProductCount)pcl.get(index); } else { return null; } }
public void setProductCount(String product, int count) {
ProductCount pc = new ProductCount();
pc.setProduct(product); pc.setCount(count); pcl.add(pc); } } /** 課題 20071128_02 ProductCount.java 製品(product)の個数 */
public class ProductCount {
private String product;
private int count;
public String getProduct() {
return product;
}
public int getCount() {
return count;
}
public void setProduct(String product) {
this.product = product;
}
public void setCount(int count) {
this.count = count; } } /** 課題 20071128_02 PriceList.java 製品(product)とその価格(price)のリスト */ import java.util.*;
public class PriceList {
private ArrayList<ProductPrice> productPrice = new ArrayList<ProductPrice>();
private String[] productList = {"SeihinA", "SeihinB", "SeihinC"};
private int[] priceList = {700, 1000, 1260};
PriceList() {
for( int i = 0; i < 3; i++ ) {
pp.setProduct(productList[i]); pp.setPrice(priceList[i]); productPrice.add(pp); } }
public int getPrice(String product) {
for( int i = 0; i < productPrice.size(); i++ ) {
ProductPrice pp = (ProductPrice)productPrice.get(i); if( product.equals(pp.getProduct()) ) { return pp.getPrice(); } } return 0; } } /** 課題 20071128_02 ProductPrice.java 製品(product)とその価格(price) */
public class ProductPrice {
private String product;
private int price;
public String getProduct() {
return product;
}
public int getPrice() {
return price;
}
public void setProduct(String product) {
this.product = product;
}
public void setPrice(int price) {
this.price = price; } }
■課題 20071128_03(簡易エディター)
概略仕様: 1.フレーム内には、パネルが1つとスクロールパネルが1つあり、レイアウトは BorderLayout()とする。パネルを NORTH にスクロールパネル を CENTER に配置する。 2.スクロールパネル内には、テキストエリアがある。スクロールパネルの属性は、縦スクロールバーを常に表示、スクロールパネルのサイズ は 500×250 とする。 3.パネル内にはボタンが二つ(それぞれのラベルを“開く”“保存”とする)あり、レイアウトは FlowLayout()とする。 (以上が前回作成したプログラム) 4.ボタン“開く”“保存”のそれぞれにアクションリスナーを登録する。 5.ボタン“開く”に対応したアクションリスナークラス OpenListener を作成する。このクラスは、JFileChooser クラスを用いてファイルを開き、 その内容をテキストエリアに書き込む。 6.ボタン“保存” に対応したアクションリスナークラス SaveListener を作成する。このクラスは、JFileChooser クラスを用いてファイルを作成又は開き、テキストエリアの内容をそのファイルに書き込む。 (1)コントロールクラスは、Kadai20071128_03 とし、以下のようなものとする。 /** 課題 20071128_03 Kadai20071128_03.java コントロールクラス */
public class Kadai20071128_03 {
public static void main(String[] args) {
MyFrame frame = new MyFrame("Kadai20071128_03");
} } (2)フレームのクラス名は MyFrame とし、以下のようなものとする。 /** 課題 20071128_03 MyFrame.java フレーム */ import java.awt.*; import javax.swing.*;
public class MyFrame extends JFrame {
private JFrame frame;
private JPanel panel;
private JScrollPane scroll;
private JButton open;
private JButton save;
private JTextArea textArea;
// private JMenuItem menuitem11; 後日の演習で使用する予定
// private JMenuItem menuitem12; 後日の演習で使用する予定
// private JMenuItem menuitem2; 後日の演習で使用する予定 private JFileChooser chooser = new JFileChooser();
MyFrame(String title) {
// JFrame のインスタンス化 frame = new JFrame(title);
// コンポーネントの作成
textArea = new JTextArea();
textArea.setWrapStyleWord(true);
textArea.setLineWrap(true);
// スクロールパネルのインスタンス化及びテキストエリアの追加 scroll = new JScrollPane(textArea);
scroll.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scroll.setPreferredSize(new Dimension(250, 250));
// JPanel のインスタンス化 panel = new JPanel();
// コンポーネントのインスタンス化
open = new JButton("開く");
save = new JButton("保存");
// ActionListener を追加
OpenListener ol = new OpenListener(frame, textArea, chooser);
open. 【 1 】(ol);
SaveListener sl = new SaveListener(frame, textArea, chooser);
// レイアウトマネージャー(FlowLayout を使用) panel.setLayout(new FlowLayout()); // コンポーネントの追加 panel.add(open); panel.add(save); // コンテントペインの取得
Container con = frame.getContentPane();
// レイアウトマネージャー(BorderLayout を使用) con.setLayout(new BorderLayout()); // コンテントペインにパネルを追加 con.add(panel, BorderLayout.NORTH); con.add(scroll, BorderLayout.CENTER); // 後日の演習でここにメニュー及びその ActionListener の追加を行う予定 // JFrame のセットアップ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } } (3)ボタン“開く”に対応したアクションリスナークラスを作成する。 /** 課題 20071128_03 OpenListener.java Open Button に対するイベントリスナー */ import java.awt.*; import javax.swing.*; import java.awt.event.*; import javax.swing.filechooser.*; import java.io.*;
public class OpenListener implements 【 2 】 { private JFrame frame;
private JTextArea textArea;
private JFileChooser chooser;
OpenListener(JFrame frame, JTextArea textArea, JFileChooser chooser) {
this.frame = frame;
this.textArea = textArea;
this.chooser = chooser;
}
public void 【 3 】(ActionEvent e) {
int returnValue = chooser.showOpenDialog(frame); // [Open File]用 JFileChooser の可視化
// 戻り値では JFileChooser が閉じられたのが、
// OK ボタンによるのか Cancel ボタンによるのかを識別 try {
File file = chooser.getSelectedFile(); // 選択されたファイルの抽象パスを取得
FileReader fr = new FileReader(file); // 文字ファイル読み込み簡易ストリーム
textArea.read(fr, null); // テキストエリアに文字列セット frame.setTitle(file.getAbsolutePath()); // フレームのタイトル変更 fr.close(); // 読み込みバッファのクローズ } catch( Exception ex ) { ex.printStackTrace(); }
} } } (4)ボタン“保存”に対応したアクションリスナークラスを作成する。 /** 課題 20071128_03 SaveListener.java Save Button に対するイベントリスナー */ import java.awt.*; import javax.swing.*; import java.awt.event.*; import javax.swing.filechooser.*; import java.io.*;
public class SaveListener implements 【 2 】 { private JFrame frame;
private JTextArea textArea;
private JFileChooser chooser;
SaveListener(JFrame frame, JTextArea textArea, JFileChooser chooser) {
this.frame = frame;
this.textArea = textArea;
this.chooser = chooser;
}
public void 【 3 】(ActionEvent e) {
int returnValue = chooser.showSaveDialog(frame); // [Save File]用 JFileChooser の可視化
// 戻り値では JFileChooser が閉じられたのが、
// OK ボタンによるのか Cancel ボタンによるのかを識別 try{
if( returnValue == JFileChooser.APPROVE_OPTION ) { // OK ボタンで JFileChooser が閉じられた場合
FileWriter fw = new FileWriter(chooser.getSelectedFile()); // 選択されたファイルの抽象パスを取得
fw.write(textArea.getText()); // テキストエリアの文字列をファイルに書き込み fw.close(); // 書き込みバッファのクローズ } } catch( Exception ex ) { ex.printStackTrace(); } } }