ソフトウェア基礎演習課題 20061206 以下のような GUI 画面を表示するプログラムを完成させなさい 前回演習で作成したプログラムにイベント処理を追加します 注意 : ファイル名が同じものがあるので 課題毎にディレクトリーを分ける等してください ( 簡易レジスター ) 概略仕様 : 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 とし 以下のようなものとする Kadai20061206_01.java コントロールクラス public class Kadai20061206_01 { public static void main(string[] args) { MyFrame frame = new MyFrame("Kadai20061206_01"); (2) フレームのクラス名は MyFrame とし 以下のようなものとする MyFrame.java フレーム
public class MyFrame { 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.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) ボタン 追加 に対応したアクションリスナークラスを作成する AddListener.java Add Button に対するイベントリスナー 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) ボタン 合計 に対応したアクションリスナークラスを作成する SumListener.java Sum Button に対するイベントリスナー public class SumListener implements ActionListener { private JTextField text; private ProductCountList pcl; SumListener(JTextField text, ProductCountList pcl) { this.text = text; this.pcl = pcl; 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) メニューアイテム バージョン に対応したアクションリスナークラスを作成する MenuListener.java MenuItem に対するイベントリスナー public class MenuListener implements ActionListener { private JMenuItem menuitem; MenuListener(JFrame frame, JMenuItem menuitem) { this.frame = frame; this.menuitem = menuitem;
// 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); panel.setlayout(new FlowLayout()); panel.add(label); // JDialog のコンテントペインを取得 Container con = dialog.getcontentpane(); con.setlayout(new FlowLayout()); // パネルの追加 con.add(panel); // JDialog のセットアップ dialog.setdefaultcloseoperation(jdialog.dispose_on_close); dialog.pack(); dialog.setvisible(true); (6) その他のクラス (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; 課題 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 フレーム public class MyFrame extends JFrame { 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); 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); // 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 javax.swing.filechooser.*; import java.io.*; public class OpenListener implements ActionListener { private JTextArea textarea; private JFileChooser chooser; OpenListener(JFrame frame, JTextArea textarea, JFileChooser chooser) { this.frame = frame; this.textarea = textarea; this.chooser = chooser;
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 javax.swing.filechooser.*; import java.io.*; public class SaveListener implements ActionListener { private JTextArea textarea; private JFileChooser chooser; SaveListener(JFrame frame, JTextArea textarea, JFileChooser chooser) { this.frame = frame; this.textarea = textarea; this.chooser = chooser; 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 に対するイベントリスナー public class MenuListener implements ActionListener { private JMenuItem menuitem; MenuListener(JFrame frame, JMenuItem menuitem) { this.frame = frame; this.menuitem = menuitem; // 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); panel.setlayout(new FlowLayout()); panel.add(label); // JDialog のコンテントペインを取得 Container con = dialog.getcontentpane(); con.setlayout(new FlowLayout()); // パネルの追加 con.add(panel); // JDialog のセットアップ dialog.setdefaultcloseoperation(jdialog.dispose_on_close); dialog.pack(); dialog.setvisible(true);