オブジェクト指向プログラミング演習課題 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 とし 講義資料に基き作成しなさい ( 簡易レジスター ) 概略仕様 : 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 とし 以下のようなものとする Kadai20071128_02.java コントロールクラス
public class Kadai20071128_02 { public static void main(string[] args) { MyFrame frame = new MyFrame("Kadai20071128_02"); (2) フレームのクラス名は MyFrame とし 以下のようなものとする MyFrame.java フレーム 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); panel1.setlayout(new FlowLayout()); panel1.add(label1); panel1.add(text1); panel2.setlayout(new FlowLayout());
panel2.add(label2); panel2.add(text2); panel3.setlayout(new FlowLayout()); panel3.add(button1); panel3.add(button2); 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) ボタン 追加 に対応したアクションリスナークラスを作成する AddListener.java Add Button に対するイベントリスナー 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) ボタン 合計 に対応したアクションリスナークラスを作成する SumListener.java Sum Button に対するイベントリスナー 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つある) は以下のようになる クラスは完成しているので そのままコピー & ペーストして使用して良い ProductCountList.java 製品 (product) の個数のリスト import java.util.*; public class ProductCountList { private ArrayList<ProductCount> pcl = new ArrayList<ProductCount>(); public int size() { return pcl.size(); public ProductCount getproductcount(int index) {
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); 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; 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++ ) { ProductPrice pp = new ProductPrice();
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; 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 フレーム 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); save. 1 (sl);
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.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.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();