ソフトウェア基礎演習 課題
20061206
以下のようなGUI 画面を表示するプログラムを完成させなさい。 前回演習で作成したプログラムにイベント処理を追加します。 注意:ファイル名が同じものがあるので、課題毎にディレクトリーを分ける等してください。■課題
20061206_01(簡易レジスター)
概略仕様: 1.フレーム内にはパネルが4つあり、レイアウトはGridLayout(4, 1)(4行1列のレイアウト)とする。 2.一つ目のパネル内には、ラベル(“製品名”と左寄せ表示)とテキストフィールド(サイズは10 桁)があり、レイアウトは FlowLayout()と する。 3.二つ目のパネル内には、ラベル(“個数”と左寄せ表示)とテキストフィールド(サイズは10 桁)があり、レイアウトは FlowLayout()とす る。 4.三つ目のパネル内にはボタンが二つ(それぞれのラベルを“追加”“合計”とする)あり、レイアウトはFlowLayout()とする。 5.四つ目のパネル内には、ラベル(“合計金額”と左寄せ表示)とテキストフィールド(サイズは10 桁)があり、レイアウトは FlowLayout() とする。 6.ボタン“追加”“合計”のそれぞれにアクションリスナーを登録する。 7.ボタン“追加”に対応したアクションリスナークラス AddListener を作成する。このクラスは、ボタンが押される度に“製品名”に付随す るテキストフィールド内の文字列に対応する製品と“個数”に付随するテキストフィールド内の(文字列を整数に変換した)数字のペアを ProductCountList クラス型の変数に順次登録してゆく。 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 等を持つ。
(以上が前回作成したプログラム)
11.MyFrame クラスにメニューを追加する。メニューは“ヘルプ”とし、メニューアイテムは“バージョン”とする。 12.メニューアイテム“バージョン”には、アクションリスナーを登録する。
13.メニューアイテム“バージョン”に対応したアクションリスナーMenulistener を作成する。このクラスは、Jdialog クラスのウィンドウを表 示し、1つのパネルを持ち、そのパネル内には一つのラベル(“Version 1.0 (released on December 6, 2006)”と左寄せ表示)を持つ。
(1)コントロールクラス(main メッソドを含むクラス)は、Kadai20061206_01 とし、以下のようなものとする。 /** 課題20061206_01 Kadai20061206_01.java コントロールクラス */
public class Kadai20061206_01 {
public static void main(String[] args) {
MyFrame frame = new MyFrame("Kadai20061206_01"); } } (2)フレームのクラス名はMyFrame とし、以下のようなものとする。 /** 課題20061206_01 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を追加
button1.addActionListener(al);
SumListener sl = new SumListener(text4, pcl); button2.addActionListener(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); // JMenuBarのインスタンス化 【 1 】 menubar = new 【 1 】(); // JMenuのインスタンス化 【 2 】 menu = new 【 2 】("ヘルプ"); // JMenuItemのインスタンス化 menuitem = new 【 3 】("バージョン"); // ActionListenerを追加
MenuListener ml = new MenuListener(frame, menuitem); menuitem.addActionListener(ml); // JMenuItemの追加 menu. 【 4 】(menuitem); // JMenuの追加 menubar. 【 4 】(menu); // JMenuBarの追加 frame. 【 5 】(menubar); // JFrameのセットアップ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } } (3)ボタン“追加”に対応したアクションリスナークラスを作成する。 /** 課題20061206_01 AddListener.java Add Buttonに対するイベントリスナー */ import java.awt.*; import javax.swing.*; import java.awt.event.*;
public class AddListener implements ActionListener { 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; }
try { pcl.setProductCount(text1.getText(), Integer.parseInt(text2.getText())); } catch( NumberFormatException ex ) { } } } (4)ボタン“合計”に対応したアクションリスナークラスを作成する。 /** 課題20061206_01 SumListener.java Sum Buttonに対するイベントリスナー */ import java.awt.*; import javax.swing.*; import java.awt.event.*;
public class SumListener implements ActionListener { private JTextField text;
private ProductCountList pcl;
SumListener(JTextField text, ProductCountList pcl) { this.text = text;
this.pcl = pcl; }
public void actionPerformed(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)メニューアイテム“バージョン”に対応したアクションリスナークラスを作成する。 /** 課題20061206_01 MenuListener.java MenuItemに対するイベントリスナー */ import java.awt.*; import javax.swing.*; import java.awt.event.*;
public class MenuListener implements ActionListener { private JFrame frame;
private JMenuItem menuitem;
MenuListener(JFrame frame, JMenuItem menuitem) { this.frame = frame;
}
public void actionPerformed(ActionEvent e) {
// JDialogインスタンス化
JDialog dialog = new JDialog(frame, "バージョン"); // JPanelのインスタンス化
JPanel panel = new JPanel();
// コンポーネントのインスタンス化
JLabel label = new JLabel("Version 1.0 (released on December 6, 2006)", JLabel.LEFT);
// レイアウトマネージャー(FlowLayoutを使用) panel.setLayout(new FlowLayout());
// コンポーネントの追加 panel.add(label);
// JDialogのコンテントペインを取得
Container con = dialog.getContentPane();
// レイアウトマネージャー(FlowLayoutを使用) con.setLayout(new FlowLayout()); // パネルの追加 con.add(panel); // JDialogのセットアップ dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); dialog.pack(); dialog.setVisible(true); } } (6)その他のクラス(4つある)は以下のようになる。 /** 課題20061206_01 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);
} }
/**
課題20061206_01 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; } } /** 課題20061206_01 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;
} } /** 課題20061206_01 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; } }
■課題
20061206_02(簡易エディター)
概略仕様: 1.フレーム内には、パネルが1つとスクロールパネルが1つあり、レイアウトはBorderLayout()とする。パネルを NORTH にスクロールパネル をCENTER に配置する。 2.スクロールパネル内には、テキストエリアがある。スクロールパネルの属性は、縦スクロールバーを常に表示、スクロールパネルのサイズ は500×250 とする。 3.パネル内にはボタンが二つ(それぞれのラベルを“開く”“保存”とする)あり、レイアウトはFlowLayout()とする。 4.ボタン“開く”“保存”のそれぞれにアクションリスナーを登録する。 5.ボタン“開く”に対応したアクションリスナークラスOpenListener を作成する。このクラスは、JFileChooser クラスを用いてファイルを開き、 その内容をテキストエリアに書き込む。 6.ボタン“保存” に対応したアクションリスナークラス SaveListener を作成する。このクラスは、JFileChooser クラスを用いてファイルを作 成又は開き、テキストエリアの内容をそのファイルに書き込む。 (以上が前回作成したプログラム) 7.MyFrame クラスにメニューを追加する。メニューは“ファイル”“ヘルプ”とし、“ファイル” のメニューアイテムは“開く”“保存”とし、 “ヘルプ”のメニューアイテムは“バージョン”とする。 8.メニューアイテム“開く”“保存”“バージョン”のそれぞれにアクションリスナーを登録する。 9.メニューアイテム“開く”に対応したアクションリスナーは、ボタン“開く”に対応したアクションリスナーOpenListener とする。 10.メニューアイテム“保存”に対応したアクションリスナーは、ボタン“保存”に対応したアクションリスナーSaveListener とする。 11.メニューアイテム“バージョン”に対応したアクションリスナーMenulistener を作成する。このクラスは、Jdialog クラスのウィンドウを表 示し、1つのパネルを持ち、そのパネル内には一つのラベル(“Version 1.0 (released on December 6, 2006)”と左寄せ表示)を持つ。(1)コントロールクラスは、Kadai20061206_02 とし、以下のようなものとする。
/**
課題20061206_02
Kadai20061206_02.java
*/
public class Kadai20061206_02 {
public static void main(String[] args) {
MyFrame frame = new MyFrame("Kadai20061206_02"); } } (2)フレームのクラス名はMyFrame とし、以下のようなものとする。 /** 課題20061206_02 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.addActionListener(ol);
SaveListener sl = new SaveListener(frame, textArea, chooser); save.addActionListener(sl); // レイアウトマネージャー(FlowLayoutを使用) panel.setLayout(new FlowLayout()); // コンポーネントの追加 panel.add(open); panel.add(save); // コンテントペインの取得
// レイアウトマネージャー(BorderLayoutを使用) con.setLayout(new BorderLayout()); // コンテントペインにパネルを追加 con.add(panel, BorderLayout.NORTH); con.add(scroll, BorderLayout.CENTER); // JMenuBarのインスタンス化 【 1 】 menubar = new 【 1 】(); // JMenuのインスタンス化 【 2 】 menu1 = new 【 2 】("ファイル"); 【 2 】 menu2 = new 【 2 】("ヘルプ"); // JMenuItemのインスタンス化 menuitem11 = new 【 3 】("開く"); menuitem12 = new 【 3 】("保存"); menuitem2 = new 【 3 】("バージョン"); // ActionListenerを追加 menuitem11.addActionListener(ol); menuitem12.addActionListener(sl);
MenuListener ml = new MenuListener(frame, menuitem2); menuitem2.addActionListener(ml); // JMenuItemの追加 menu1. 【 4 】(menuitem11); menu1. 【 4 】(menuitem12); menu2. 【 4 】(menuitem2); // JMenuの追加 menubar. 【 4 】(menu1); menubar. 【 4 】 menu2); // JMenuBarの追加 frame. 【 5 】(menubar); // JFrameのセットアップ frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.pack(); frame.setVisible(true); } } (3)ボタン“開く”に対応したアクションリスナークラスを作成する。 /** 課題20061206_02 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 ActionListener { 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 actionPerformed(ActionEvent e) {
int returnValue = chooser.showOpenDialog(frame); // [Open File]用JFileChooserの可視化 // 戻り値ではJFileChooserが閉じられたのが、 // OKボタンによるのかCancelボタンによるのかを識別 try {
if( returnValue == JFileChooser.APPROVE_OPTION ) { // OKボタンでJFileChooserが閉じられた場合 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)ボタン“保存”に対応したアクションリスナークラスを作成する。 /** 課題20061206_02 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 ActionListener { 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 actionPerformed(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(); }
} } (5)メニューアイテム“バージョン”に対応したアクションリスナークラスを作成する。 /** 課題20061206_02 MenuListener.java MenuItemに対するイベントリスナー */ import java.awt.*; import javax.swing.*; import java.awt.event.*;
public class MenuListener implements ActionListener { private JFrame frame;
private JMenuItem menuitem;
MenuListener(JFrame frame, JMenuItem menuitem) { this.frame = frame;
this.menuitem = menuitem; }
public void actionPerformed(ActionEvent e) {
// JDialogインスタンス化
JDialog dialog = new JDialog(frame, "バージョン"); // JPanelのインスタンス化
JPanel panel = new JPanel();
// コンポーネントのインスタンス化
JLabel label = new JLabel("Version 1.0 (released on December 6, 2006)", JLabel.LEFT);
// レイアウトマネージャー(FlowLayoutを使用) panel.setLayout(new FlowLayout());
// コンポーネントの追加 panel.add(label);
// JDialogのコンテントペインを取得
Container con = dialog.getContentPane();
// レイアウトマネージャー(FlowLayoutを使用) con.setLayout(new FlowLayout()); // パネルの追加 con.add(panel); // JDialogのセットアップ dialog.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE); dialog.pack(); dialog.setVisible(true); } }