Comments
Description
Transcript
解答例(PDF形式 55KB)
サンプルプログラムの解答例 /** * Worker.java */ public abstract class Worker { String name; //名前 int salary; //給料 //コンストラクタ public Worker(String n) { name = n; salary = 0; } //名前を取得する public String getName() { return name; } //給料を取得する public int getSalary() { return salary; } //給料を加算する( 抽象メソッド ) public abstract void addSalary(int start, int end); } /** * Staff.java */ public class Staff extends Worker { int dailyPay; //日給 //コンストラクタ public Staff(String n, int d) { super(n); dailyPay = d; } //給料を加算する public void addSalary(int start, int end) { salary += dailyPay; int time = end - start; if(time > 8) { salary += (time - 8) * dailyPay * 1.5 / 8; } } } 1 /** * Arbeit.java */ public class Arbeit extends Worker { int hourlyPay; //時給 //コンストラクタ public Arbeit(String n, int h) { super(n); hourlyPay = h; } //給料を加算する public void addSalary(int start, int end) { salary += (end - start) * hourlyPay; } } サンプルプログラムの GUI 化(おまけ) ダブルクリック クリック 図 1: GUI サンプルプログラムの実行例 /** * CompanyFrame.java * * 会社の従業員リストを管理するためのメインウィンド ウ */ import import import import import java.awt.*; java.awt.event.*; javax.swing.*; javax.swing.border.*; java.util.*; public class CompanyFrame extends JFrame { 2 Company aCompany; JList workersLst; JButton addBtn, removeBtn; JLabel sumLbl; JMenuItem exitItm; //給与計算を行う会社 //従業員のリスト //追加、削除ボタン //総給与を表示するラベル //終了メニュー //コンストラクタ public CompanyFrame() { JMenuBar bar = new JMenuBar(); JMenu fileMn = new JMenu("ファイル"); exitItm = new JMenuItem("終了"); ActionListener listener = new CompanyActionListener(this); exitItm.addActionListener(listener); fileMn.add(exitItm); bar.add(fileMn); setJMenuBar(bar); JPanel panel1 = new JPanel(new BorderLayout()); workersLst = new JList(new DefaultListModel()); workersLst.addMouseListener(new CompanyMouseListener(this)); JScrollPane pane = new JScrollPane(workersLst); pane.setBorder(new TitledBorder("従業員リスト ")); panel1.add(pane, "Center"); sumLbl = new JLabel("0 円", JLabel.CENTER); sumLbl.setBorder(new TitledBorder("総給与")); panel1.add(sumLbl, "South"); getContentPane().add(panel1, "Center"); } JPanel panel2 = new JPanel(); addBtn = new JButton("追加"); addBtn.addActionListener(listener); panel2.add(addBtn); removeBtn = new JButton("削除"); removeBtn.addActionListener(listener); panel2.add(removeBtn); getContentPane().add(panel2, "South"); setSize(200, 250); //会社の設定 public void setCompany(Company c) { aCompany = c; update(); } //会社の取得 public Company getCompany() { return aCompany; } //リストに選択されている Worker を取得する public Worker getSelectedWorker() { DefaultListModel model = (DefaultListModel) workersLst.getModel(); Iterator it = aCompany.workers.iterator(); while(it.hasNext()) { Worker w = (Worker) it.next(); if(w.getName().equals(workersLst.getSelectedValue())) return w; 3 } } return null; //表示を更新する public void update() { setTitle(aCompany.getName()); DefaultListModel model = (DefaultListModel) workersLst.getModel(); model.removeAllElements(); Iterator it = aCompany.workers.iterator(); while(it.hasNext()) { model.addElement(((Worker)it.next()).getName()); } sumLbl.setText(String.valueOf(aCompany.sumSalary()) + "円"); } //プログラムの開始位置 public static void main(String args[]) { Company soft = new Company("ひさし製作所"); Worker hisashi = new Staff("ひさし ", 15000); Worker keiji = new Arbeit("けーじ ", 1000); soft.addWorker(hisashi); soft.addWorker(keiji); hisashi.addSalary(9, 20); keiji.addSalary(8, 17); } CompanyFrame frame = new CompanyFrame(); frame.setCompany(soft); frame.setVisible(true); } /** * CompanyActionListener.java * 従業員を追加したり削除するためのリスナ * */ import java.awt.event.*; public class CompanyActionListener implements ActionListener { CompanyFrame frame; //コンストラクタ public CompanyActionListener(CompanyFrame f) { frame = f; } //アクション発生時の処理 public void actionPerformed(ActionEvent e) { if(e.getSource().equals(frame.addBtn)) { AddWorkerDialog dialog = new AddWorkerDialog(frame); dialog.setVisible(true); } 4 } else if(e.getSource().equals(frame.removeBtn)) { frame.getCompany().removeWorker(frame.getSelectedWorker()); frame.update(); } else if(e.getSource().equals(frame.exitItm)) { System.exit(0); } } /** * AddWorkerDialog.java * * 従業員を追加するためのダ イアログ */ import java.awt.*; import java.awt.event.*; import javax.swing.*; public class AddWorkerDialog extends JDialog { ButtonGroup group; JTextField nameFld, payFld; JButton okBtn, cancelBtn; //コンストラクタ public AddWorkerDialog(CompanyFrame f) { super(f, "従業員追加ダ イアログ ", true); JPanel panel1 = new JPanel(); group = new ButtonGroup(); JRadioButton staff = new JRadioButton("社員", true); JRadioButton arbeit = new JRadioButton("アルバイト ", false); staff.setActionCommand("staff"); arbeit.setActionCommand("arbeit"); group.add(staff); group.add(arbeit); panel1.add(staff); panel1.add(arbeit); getContentPane().add(panel1, "North"); JPanel panel2 = new JPanel(); panel2.add(new JLabel("名前:")); nameFld = new JTextField(10); panel2.add(nameFld); panel2.add(new JLabel("日給/時給:")); payFld = new JTextField(6); panel2.add(payFld); getContentPane().add(panel2, "Center"); JPanel panel3 = new JPanel(); ActionListener listener = new AddWorkerButtonListener(f, this); okBtn = new JButton("決定"); okBtn.addActionListener(listener); panel3.add(okBtn); cancelBtn = new JButton("キャンセル"); 5 cancelBtn.addActionListener(listener); panel3.add(cancelBtn); getContentPane().add(panel3, "South"); } pack(); } /** * AddWorkerButtonListener.java * 従業員を追加するためのリスナ * */ import java.awt.event.*; public class AddWorkerButtonListener implements ActionListener { CompanyFrame frame; AddWorkerDialog dialog; //コンストラクタ public AddWorkerButtonListener(CompanyFrame f, AddWorkerDialog d) { frame = f; dialog = d; } //アクション発生時の処理 public void actionPerformed(ActionEvent e) { if(e.getSource().equals(dialog.okBtn)) { Worker worker; String name = dialog.nameFld.getText(); int pay = Integer.parseInt(dialog.payFld.getText()); if(dialog.group.getSelection().getActionCommand().equals("staff")) { worker = new Staff(name, pay); } else { worker = new Arbeit(name, pay); } frame.getCompany().addWorker(worker); frame.update(); } dialog.setVisible(false); } } /** * CompanyMouseListener.java * * 給料を追加するダ イアログを表示するためのリスナ */ import java.awt.event.*; public class CompanyMouseListener extends MouseAdapter { CompanyFrame frame; 6 //コンストラクタ public CompanyMouseListener(CompanyFrame f) { frame = f; } //マウスクリック時の処理 public void mouseClicked(MouseEvent e) { if(e.getClickCount() == 2) { Worker worker = frame.getSelectedWorker(); AddSalaryDialog dialog = new AddSalaryDialog(frame, worker); dialog.setVisible(true); } } } /** * AddSalaryDialog.java * 従業員の勤務時間を入力するためのダ イアログ * */ import java.awt.*; import java.awt.event.*; import javax.swing.*; public class AddSalaryDialog extends JDialog { Worker aWorker; //給与を追加する従業員 JComboBox startCmb, endCmb; //勤務時間を入力するコンボボックス JButton okBtn, cancelBtn; //決定、キャンセルボタン //コンストラクタ public AddSalaryDialog(CompanyFrame f, Worker w) { super(f, w.getName() + " の給与追加ダ イアログ ", true); aWorker = w; JPanel panel1 = new JPanel(); panel1.add(new JLabel("出社時間")); startCmb = new JComboBox(); for(int i = 8; i <= 24; i++) { startCmb.addItem(String.valueOf(i)); } panel1.add(startCmb); panel1.add(new JLabel("退社時間")); endCmb = new JComboBox(); for(int i = 8; i <= 24; i++) { endCmb.addItem(String.valueOf(i)); } panel1.add(endCmb); getContentPane().add(panel1, "North"); JPanel panel2 = new JPanel(); ActionListener listener = new AddSalaryButtonListener(f, this); okBtn = new JButton("決定"); okBtn.addActionListener(listener); panel2.add(okBtn); 7 } cancelBtn = new JButton("キャンセル"); cancelBtn.addActionListener(listener); panel2.add(cancelBtn); getContentPane().add(panel2, "South"); pack(); //Worker を取得する public Worker getWorker() { return aWorker; } } /** * AddSalaryButtonListener.java * * 従業員の給料を追加するためのリスナ */ import java.awt.event.*; public class AddSalaryButtonListener implements ActionListener { CompanyFrame frame; AddSalaryDialog dialog; //コンストラクタ public AddSalaryButtonListener(CompanyFrame f, AddSalaryDialog d) { frame = f; dialog = d; } //アクション発生時の処理 public void actionPerformed(ActionEvent e) { if(e.getSource().equals(dialog.okBtn)) { Worker worker = dialog.getWorker(); int start = Integer.parseInt((String)dialog.startCmb.getSelectedItem()); int end = Integer.parseInt((String)dialog.endCmb.getSelectedItem()); worker.addSalary(start, end); frame.update(); } dialog.setVisible(false); } } 8 Worker Company name:String 1 getName():String addWorker(w:Worker):void sumSalary():int name:String salary:int * getName():String getSalary():int addSalary(start:int, end:int):void 9 図 2: GUI サンプルプログラムのクラス図 Staff CompanyFrame workersLst:JList addBtn,removeBtn:JButton sumLbl:JLabel exitItm:JMenuItem dailyPay:int addSalary(start:int, end:int):void Arbeit hourlyPay:int addSalary(start:int, end:int):void getSelectedWorker():Worker update():void CompanyActionListener actionPerformed(e:ActionEvent):void AddWorkerButtonListener actionPerformed(e:ActionEvent):void AddWorkerDialog group:ButtonGroup nameFld,payFld:JTextField okBtn,cancelBtn:JButton CompanyMouseListener mouseClicked(e:MouseEvent):void AddSalaryButtonListener actionPerformed(e:ActionEvent):void AddSalaryDialog startCmb,endCmb:JComboBox okBtn,cancelBtn:JButton