解答例(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