• 検索結果がありません。

public class Kadai _02 { public static void main(string[] args) { MyFrame frame = new MyFrame("Kadai _02"); (2) フレームのクラス名は MyFrame とし 以下

N/A
N/A
Protected

Academic year: 2021

シェア "public class Kadai _02 { public static void main(string[] args) { MyFrame frame = new MyFrame("Kadai _02"); (2) フレームのクラス名は MyFrame とし 以下"

Copied!
9
0
0

読み込み中.... (全文を見る)

全文

(1)

オブジェクト指向プログラミング演習 課題 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 コントロールクラス */

(2)

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());

(3)

// コンポーネントの追加 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;

}

(4)

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();

}

(5)

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++ ) {

(6)

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 クラスを用いてファイルを作

(7)

成又は開き、テキストエリアの内容をそのファイルに書き込む。 (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);

(8)

// レイアウトマネージャー(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(); }

(9)

} } } (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(); } } }

参照

関連したドキュメント

向上を図ることが出来ました。看護職員養成奨学金制度の利用者は、26 年度 2 名、27 年度 2 名、28 年 度は

 在籍者 101 名の内 89 名が回答し、回収 率は 88%となりました。各事業所の内訳 は、生駒事業所では在籍者 24 名の内 18 名 が回答し、高の原事業所では在籍者

平成 28 年 3 月 31 日現在のご利用者は 28 名となり、新規 2 名と転居による廃 止が 1 件ありました。年間を通し、 20 名定員で 1

The parameters set in trapezoidal operation can be used to start tuning sinusoidal mode. Begin with 6 window sinusoidal mode and then try to reduce the window

 渡嘉敷島の慰安所は慶良間空襲が始まった23日に爆撃され全焼した。7 人の「慰安婦」のうちハルコ

② 入力にあたっては、氏名カナ(半角、姓と名の間も半角で1マス空け) 、氏名漢 字(全角、姓と名の間も全角で1マス空け)、生年月日(大正は

まず、本校のコンピュータの設置状況からお話します。本校は生徒がクラスにつき20人ほど ですが、クラス全員が

「PTA聖書を学ぶ会」の通常例会の出席者数の平均は 2011 年度は 43 名だったのに対して、2012 年度は 61 名となり約 1.5