Pracownicy I
Stworzyć klasę Employee (pracownik), opisującą wspólne atrrybuty danych o pracownikach:
- imię,
- nazwisko,
- wiek,
- pensja.
oraz zawierającą odpowiednie metody, które pozwolą uzyskać informacje o danym pracowniku oraz ustalić pensję i zmienić pensję o podany procent.
Użyć tej klasy w innej klasie, w której dostarczymy:
-
metody definiowania danych o pracownikach:
Employee defEmp(String msg),
która w dialogu wejściowympyta użytkownika o dane pracownika (argument msg jest komunikatem np. "Podaj dane o pracowniku"),
tworzy obiekt, reprezentujący wprowadzone dane o pracowniku,
i zwraca referencję do niego. -
metody showInfo(Employee), która wyświetla w dialogu komunikatów dane o podanym jako argument pracowniku
-
metody changeSalary(Employee), która pyta o procent o jaki chcemy zmienić pensję podanego jako argument pracownika i zmienia tę pensję.
Przetestować te metody na przykładzie wprowadzenia danych dla 3 pracowników, pokazania tych danych, zmiany pensji i pokazania zmienionych danych.
Do wprowadzabnia danych użyć dialogu i skanera.
Mam dwie klasy.
Klasa pierwsza:
public class Employee {
private String firstName;
private String lastName;
private int age;
private double salary;
// Konstruktor - tworzy nowego pracownika
public Employee(String fname, String lname, int age, double salary) {
this.firstName = fname;
this.lastName = lname;
this.age = age;
this.salary = salary;
}
// Dostęp do prywatnych pól klasy
public double getSalary() {
return salary;
}
public void setSalary(double salary) {
this.salary = salary;
}
public String getFirstName() {
return firstName;
}
public String getLastName() {
return lastName;
}
public int getAge() {
return age;
}
// Metoda zmiany pensji o podany procent
public void chgSalary(double percent) {
salary *= (1 + percent/100);
}
// Opis obiektu
public String toString() {
return firstName + " " + lastName + " " + age + " " + salary;
}
}
Klasa druga:
import java.util.*;
import static javax.swing.JOptionPane.*;
public class EmpManager {
// Metoda definiowania pracownika
// parametr msg oznacza komunikat wyświetlany w dialogu wejściowym
// metoda zwraca referencję do nowoutworzonego obiektu-pracownika
// lub null jesli zrezygnowano z wprowadzania danych
public static Employee defEmp(String msg) {
String in = showInputDialog(msg);
if (in == null) return null; // zrezygnowano z wprowadzania
Scanner scan = new Scanner(in);
return new Employee(
scan.next(), scan.next(), scan.nextInt(), scan.nextDouble()
);
}
// Zapytanie o zmianę pensji
// i dokonanie jej
public static void changeSalary(Employee emp) {
String in = showInputDialog("Zmiana pensji dla " + emp.getLastName());
if (in != null) emp.chgSalary(new Scanner(in).nextDouble());
}
// Wyświetla informacje o pracowniku
public static void showInfo(Employee emp) {
showMessageDialog(null, emp);
}
public static void main(String[] args) {
Employee e = defEmp("Podaj dane pracownika");
if (e == null) showMessageDialog(null, "Nie podano danych");
else {
showInfo(e);
changeSalary(e);
showInfo(e);
}
}
}
//////////////////////
W Eclipse wyświetla mi błąd gdy chce wprowadzić pracownika:
Exception in thread "main" java.util.NoSuchElementException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at zad22.EmpManager.defEmp(EmpManager.java:24)
at zad22.EmpManager.main(EmpManager.java:43)