자바 입출력 질문
조회수 1684회
EmployeeDB.java
import java.awt.; import java.awt.event.; import java.io.*;
public class EmployeeDB extends Frame implements ActionListener { static final int NONE = 0; static final int ADD = 1; static final int TOTAL = 2; static final int SEARCH = 3; static final int REMOVE = 4; static final int ESC = 5; Panel left, bottom; LabeledTextField name, number, dept, phone; TextArea display; Button addB, totalB, searchB, removeB, escB, exitB; Table table; int action; int count;
public EmployeeDB() {
setLayout(new BorderLayout());
action = NONE;
left = new Panel();
bottom = new Panel();
display = new TextArea();
display.setEditable(false);
name = new LabeledTextField("이 름");
name.setEditable(false);
number = new LabeledTextField("사 번");
number.setEditable(false);
dept = new LabeledTextField("부 서");
dept.setEditable(false);
phone = new LabeledTextField("전 화");
phone.setEditable(false);
left.setLayout(new GridLayout(4,1));
left.setSize(400, 300);
left.add(name);
left.add(number);
left.add(dept);
left.add(phone);
addB = new Button("추 가");
addB.addActionListener(this);
addB.setActionCommand("add");
totalB = new Button("전체 보기");
totalB.addActionListener(this);
totalB.setActionCommand("total");
searchB = new Button("검 색");
searchB.addActionListener(this);
searchB.setActionCommand("search");
removeB = new Button("삭 제");
removeB.addActionListener(this);
removeB.setActionCommand("remove");
escB = new Button("취 소");
escB.addActionListener(this);
escB.setActionCommand("esc");
exitB = new Button("종 료");
exitB.addActionListener(this);
exitB.setActionCommand("exit");
exitB.setBackground(Color.red);
bottom.setLayout(new GridLayout(1,6));
bottom.add(addB);
bottom.add(totalB);
bottom.add(searchB);
bottom.add(removeB);
bottom.add(escB);
bottom.add(exitB);
add("Center", display);
add("West", left);
add("South", bottom);
table = new Table();
}
public void initialize() {
action = NONE;
addB.setEnabled(true);
totalB.setEnabled(true);
searchB.setEnabled(true);
removeB.setEnabled(true);
name.setText("");
number.setText("");
dept.setText("");
phone.setText("");
name.setEditable(false);
number.setEditable(false);
dept.setEditable(false);
phone.setEditable(false);
}
public void actionPerformed(ActionEvent e) {
int index = 0;
String cmd = e.getActionCommand();
String nameString, num, part, tel;
boolean found = false;
String msg = "";
nameString = name.getText().trim();
count = nameString.length();
if(cmd.equals("add")) {
if(action != ADD) {
action = ADD;
name.setEditable(true);
number.setEditable(true);
dept.setEditable(true);
phone.setEditable(true);
totalB.setEnabled(true);
searchB.setEnabled(true);
removeB.setEnabled(true);
return;
}
if(nameString == null || nameString.length() == 0)
return;
num = number.getText().trim();
if(num == null || num.length() == 0)
return;
part = dept.getText().trim();
if(part == null || part.length() == 0)
return;
tel = phone.getText().trim();
display.setText(nameString + num + part + tel);
table.add(nameString, num, part, tel);
display.append("\n 등록을 성공적으로 마쳤습니다.");
initialize();
} else if(cmd.equals("total")) {
action = TOTAL;
initialize();
index = table.getIndex();
display.setText("\n 검색 건수 : 총 " + Integer.toString(index+1)+ " 건\n");
display.append("\n============================================");
display.append("\n 순번 \t성명 \t사번 \t부서명 \t전화번호 ");
display.append("\n--------------------------------------------\n\n");
if(index < 0) {
display.append(" 등록된 자료가 없습니다. \n");
return;
}
for(int i = 0; i <= index; i++) {
Record rec = table.readRec(i);
msg = " " + Integer.toString(i+1) + " \t ";
msg += rec.getName() + " \t";
msg += Integer.toString(rec.getNum()) + " \t";
msg += rec.getPart() + " \t";
msg += rec.getTel() + "\n";
display.append(msg);
}
} else if(cmd.equals("search")) {
if(action != SEARCH) {
action = SEARCH;
name.setEditable(true);
addB.setEnabled(false);
totalB.setEnabled(false);
removeB.setEnabled(false);
return;
}
Record rec;
index = table.getIndex();
nameString = name.getText().trim();
if(nameString == null || nameString.length() == 0)
return;
display.setText("\n ## 개인 조회 ###########\n");
display.append("\n============================================");
display.append("\n 순번 \t성명 \t사번 \t부서명 \t전화번호 ");
display.append("\n--------------------------------------------\n\n");
for(int i = 0; i <= index; i++) {
rec = table.readRec(i);
if(nameString.equals(table.readName(i, nameString.length()))) {
found = true;
}
if(found) {
msg = " " + Integer.toString(i+1) + " \t ";
msg += rec.getName() + " \t";
msg += Integer.toString(rec.getNum()) + " \t";
msg += rec.getPart() + " \t";
msg += rec.getTel() + "\n";
display.append(msg);
msg = "";
break;
}
}
if (!found) {
display.setText(" 조회하신 성명이나 사번의 직원이 없습니다...");
}
initialize();
} else if(cmd.equals("remove")) {
if(action != REMOVE) {
action = REMOVE;
name.setEditable(true);
addB.setEnabled(false);
totalB.setEnabled(false);
searchB.setEnabled(false);
return;
}
index = table.getIndex();
nameString = name.getText().trim();
if(nameString == null || nameString.length() == 0)
return;
display.setText("\n ## 삭제 ###########\n");
display.append("\n============================================");
display.append("\n 순번 \t성명 \t사번 \t부서명 \t전화번호 ");
display.append("\n--------------------------------------------\n\n");
for(int i = 0; i <= index; i++) {
Record rec = table.readRec(i);
if(nameString.equals(table.readName(i, nameString.length()))) {
found = true;
}
if(found) {
msg = rec.getName();
msg += Integer.toString(rec.getNum());
msg += rec.getPart();
msg += rec.getTel();
display.append(msg);
msg = "";
found = true;
display.append("\n 위의 자료를 삭제하였습니다....");
for(int j=i+1; j <= index; j++) {
rec = table.readRec(j);
table.writeRec(rec.getName(),rec.getNum(),rec.getPart(),rec.getTel(),j-1);
}
table.remove(--index);
break;
}
}
if(!found) {
display.append("조회하신 성명의 직원이 없습니다...");
}
initialize();
} else if(cmd.equals("esc")) {
action = NONE;
initialize();
} else if(cmd.equals("exit")) {
table.close();
setVisible(false);
dispose();
System.exit(0);
}
}
class Table {
private RandomAccessFile myRAFile;
private int recordCount;
private int recordLength = 50;
private int recordOffset = 4;
public Table() {
try {
myRAFile = new RandomAccessFile("employee.db", "rw");
if(myRAFile.length() ==0) {
recordCount = -1;
} else {
recordCount = myRAFile.readInt();
}
} catch(IOException e) {
System.out.println("Can't access employee.dat");
}
}
public int getIndex() {
return recordCount;
}
public void add(String name, String num, String part, String tel) {
writeRec(name, Integer.parseInt(num), part, tel, ++recordCount);
}
public void close() {
try {
myRAFile.close();
} catch(IOException ioe) {
System.out.println("IOException during close file");
}
}
public Record readRec(int index) {
String name="", part="", tel="" ;
int num = -1 ;
try {
myRAFile.seek(index * recordLength + recordOffset);
for(int i = 0; i < 5;i++) {
name += myRAFile.readChar();
}
num = myRAFile.readInt();
for(int i = 0; i < 6;i++) {
part += myRAFile.readChar();
}
for(int i = 0; i < 8;i++) {
tel += myRAFile.readChar();
}
} catch(IOException ioe) {
System.out.println("IOException during read file..");
}
return (new Record(name, num, part, tel));
}
public String readName(int index, int len) {
String name="";
try {
myRAFile.seek(index * recordLength + recordOffset);
for(int i = 0; i < len;i++) {
name += myRAFile.readChar();
}
} catch (IOException ioe) {
System.out.println("IOException :"+ioe.toString());
}
return (name);
}
public void remove(int i) {
recordCount = i;
}
public void writeRec(String name, int num, String part, String tel, int index) {
int len = 0;
try {
myRAFile.seek(index * recordLength + recordOffset);
len = name.length();
for(int i =0;i < 5;i++) {
myRAFile.writeChar((i < len ? name.charAt(i) : ' '));
}
myRAFile.writeInt(num);
len = part.length();
for(int i =0;i < 6;i++) {
myRAFile.writeChar((i < len ? part.charAt(i) : ' '));
}
len = tel.length();
for(int i =0;i < 8;i++) {
myRAFile.writeChar((i < len ? tel.charAt(i) : ' '));
}
myRAFile.seek(0);
myRAFile.writeInt(recordCount);
} catch(IOException ioe) {
System.out.println("IOException while writing..");
}
}
}
class Record {
private String name;
private int num;
private String part;
private String tel;
public Record(String na, int n, String p, String t) {
name = na;
num = n;
part = p;
tel = t;
}
public String getName() {
return(name);
}
public int getNum() {
return(num);
}
public String getPart() {
return(part);
}
public String getTel() {
return(tel);
}
}
public static void main(String agrs[]) {
EmployeeDB db = new EmployeeDB();
db.setSize(550, 300);
db.setVisible(true);
}
}
LabeledTextField.java
import java.awt.*;
public class LabeledTextField extends Panel{
private Label label;
private TextField field;
private String labelPosition;
private String fieldPosition;
public LabeledTextField(String labelString) {
this(labelString, "1%, 5%, 25%, 95%", "27%, 5%, 98%, 95%");
}
public LabeledTextField(String labelString, String labelPosition, String fieldPosition) {
super();
setLayout(new FlowLayout());
//Plsition Layout은 자바 클래스 내부에 있는 레이아웃이 아니라 수
this.labelPosition = labelPosition;
this.fieldPosition = fieldPosition;
label = new Label(labelString);
field = new TextField(20);
add(labelPosition, label);
add(fieldPosition, field);
}
public String getText() {
return field.getText();
}
public void setText(String m) {
field.setText(m);
}
public void setEditable(boolean t) {
boolean able = field.isEditable();
if(t != able)
field.setEditable(t);
}
public static void main(String args[]) {
Frame f = new Frame();
LabeledTextField lt = new LabeledTextField("Name:");
f.add("South", lt);
f.setSize(400, 200);
f.setVisible(true);
}
}
이 코드를 수정하고 싶습니다... 이 코드를 실행했을 때, 삭제와 검색할 경우 맨 앞글자만 입력해도 이게 실행됩니다. 그런데 전부 적었을 때만 삭제되고 검색할 수 있도록 수정하고 싶어요..ㅠ
-
(•́ ✖ •̀)
알 수 없는 사용자
1 답변
-
if(nameString.equals(table.readName(i, nameString.length()))) { found = true; }
먼저, 테이블 상에 "홍길동1", "홍길동2"이라는 사람이 순서대로 입력되었다고 가정하겠습니다.
검색창에 "홍"을 입력하면 nameString에 "홍"이 저장됩니다.
그럼 일단 nameString.length() 는 1이 되겠죠.
그렇게 되면 table.readName(i, nameString.length())는 table.readName(i, 1)이 되고, 각 name 필드의 1바이트씩만 읽어오겠죠.
그러다가 "홍길동1"의 "홍"을 가져온다면, nameString.equals(table.readName(i, nameString.length()))이 True가 되겠죠?"홍"과 "홍"을 비교한 거니까요. 그래서 if(found)이하의 코드가 실행되구요.
name 필드 전체를 가져오고싶으면 table.readName()함수를 수정해야겠네요. 메소드 파라미터를 i 하나만 쓰시고, 항상 5바이트씩 읽어오면 되겠네요.(writeRec()메소드를 보니 name 필드가 5바이트네요.)
그래서 최종적으로, 최소한의 수정으로 고친다면
if(nameString.equals(table.readName(i, nameString.length()))) { found = true; }
이 부분을
if(nameString.equals(table.readName(i, 5).trim())) { found = true; }
로 고치면 되지 않을까 합니다. 끝에 trim()을 쓴 이유는 writeRec()메소드로 name필드에 이름을 저장할 때, 입력한 이름이 5글자보다 작으면 뒤에는 공백으로 채워줬기 때문입니다.
(참고로 제가 자바 컴파일러가 현재 없어서 테스트해보지는 못했습니다.)
-
(•́ ✖ •̀)
알 수 없는 사용자
- 안녕하세요 정말 정말 감사드리고요 ㅠㅠㅠㅠㅠ 아니 진짜 ㅠㅠㅠㅠㅠㅠ 전대호님 자바 천재 아니신가요? 진짜 실행되는 거 보고 너무 놀랐습니다.. 네 오류 없이 너무너무 잘 되어요.. 어떻게 코드만 쓱 보시고 수정하실 수 있으시지? 솔직히 코드도 워낙 긴지라 기대도 그리 안했는데 정말 감사드리고 ㅠㅠㅠ 긴 코드 봐주시느라 정말 고생하셨습니다. 정말 감사합니다 ㅠㅠ! 알 수 없는 사용자 2017.11.26 19:19
- 더군다나 자세한 설명까지.. 진짜 너무 감사드리고요... 긴 코드 읽으시느라 정말 수고 많으셨어요.. 아니 근데 저걸 진짜 어떻ㄱ ㅔ수정하셨지..? 심지어 최소한의 수정이야.. 와....... 와... 저 이분야로 오면서.. 이 분야가 천재는 많긴 하지 ㅇㅇ 했는데 진짜 이렇게 접하게 되니까 너무 대단하시고 신기하네요.. 정말 감사합니다 ㅠㅠㅠ 알 수 없는 사용자 2017.11.26 19:21
- ㅎㅎ;아니에요 버그하나 찾는거보다 이걸 짜신게 더 대단한거죵.. 알 수 없는 사용자 2017.11.26 19:34
-
댓글 입력