국비학원/숙제
Day12_성적 관리 테이블
루팽
2022. 12. 27. 21:38
숙제-성적 관리 테이블
package dev_java.week3;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;
public class StudentScore_2 implements ActionListener {
// 선언부
StudentScoreLogic_2 sLogic = new StudentScoreLogic_2(this);
JFrame jf = new JFrame();
// north, south 패널
JPanel jp_north = new JPanel();
JPanel jp_south = new JPanel();
JLabel jlb_north = new JLabel("성적처리인원수: ");
JLabel jlb_num = new JLabel("명 ");
JTextField jtf_north = new JTextField(20);
// 버튼만들기
JButton jbtn_new = new JButton("만들기");
JButton jbtn_calc = new JButton("연산");
JButton jbtn_sample = new JButton("3명 샘플");
JButton jbtn_clear = new JButton("지우기");
JButton jbtn_exit = new JButton("종료");
// 테이블 설정
String[] header = { "이름", "국어", "영어", "수학", "총점", "평균", "석차" };
String[][] datas = new String[3][7];
DefaultTableModel dtm = new DefaultTableModel(datas, header);
JTable jtb = new JTable(dtm);
JScrollPane jsp = new JScrollPane(jtb, JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED,
JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
// 생성자
public StudentScore_2() {
initDisplay();
}
// 화면처리부
public void initDisplay() {
// 패널에 버튼, 텍스트추가
jp_north.add(jlb_north);
jp_north.add(jtf_north);
jp_north.add(jlb_num);
jp_north.add(jbtn_new);
jp_south.add(jbtn_calc);
jp_south.add(jbtn_sample);
jp_south.add(jbtn_clear);
jp_south.add(jbtn_exit);
// 패널 레이아웃
jp_north.setLayout(new FlowLayout(FlowLayout.CENTER));
jp_south.setLayout(new FlowLayout(FlowLayout.RIGHT));
// 텍스트, 버튼 크기설정
jtf_north.setPreferredSize(new Dimension(50, 30));
jbtn_new.setPreferredSize(new Dimension(80, 30));
jbtn_calc.setPreferredSize(new Dimension(80, 30));
jbtn_sample.setPreferredSize(new Dimension(90, 30));
jbtn_clear.setPreferredSize(new Dimension(80, 30));
jbtn_exit.setPreferredSize(new Dimension(80, 30));
// 텍스트 오른쪽 정렬
jtf_north.setHorizontalAlignment(JTextField.RIGHT);
// 이벤트 리스너 연결
jtf_north.addActionListener(this);
jbtn_new.addActionListener(this);
jbtn_calc.addActionListener(this);
jbtn_sample.addActionListener(this);
jbtn_clear.addActionListener(this);
jbtn_exit.addActionListener(this);
// 창닫기 버튼 클릭시 종료처리
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// JFrame에 추가
jf.add("North", jp_north);
jf.add("South", jp_south);
jf.setTitle("성적 처리");
jf.setSize(450, 300);
jf.setVisible(true);
}
public static void main(String[] args) {
new StudentScore_2();
}
@Override
public void actionPerformed(ActionEvent e) {
Object obj = e.getSource();
if (obj == jbtn_new) { // 만들기
sLogic.jTable();
sLogic.newTable();
} else if (obj == jbtn_calc) { // 연산
sLogic.calcTable();
} else if (obj == jbtn_sample) { // 3명 샘플
sLogic.jTable();
sLogic.sampleTable();
} else if (obj == jbtn_clear) { // 지우기
sLogic.clearTable();
} else if (obj == jbtn_exit) { // 종료
System.exit(0);
}
}
}
package dev_java.week3;
public class StudentScoreLogic_2 {
StudentScore_2 sScore = null;
// 셍성자
public StudentScoreLogic_2(StudentScore_2 sScore) {
this.sScore = sScore;
}
// 테이블 세팅
public void jTable() {
sScore.jf.add("Center", sScore.jsp);
sScore.jf.setVisible(true);
}
// 새로운 테이블 만들기
public void newTable() {
String newTable[][] = new String[Integer.parseInt(sScore.jtf_north.getText())][7];
sScore.dtm.setDataVector(newTable, sScore.header);
sScore.jtf_north.setText(""); // input에 입력된 문자열을 지우는 역할
}
// 총점, 평균, 석차 구하기
public void calcTable() {
// 총점 구하기
int total[] = new int[sScore.dtm.getRowCount()];
for (int i = 0; i < total.length; i++) {
for (int j = 1; j <= 3; j++) {
System.out.println(total[i]);
total[i] += Integer.parseInt(sScore.jtb.getValueAt(i, j).toString()); // jtb? dtm?
}
sScore.jtb.setValueAt(total[i], i, 4);
}
// 평균 구하기
double avg[] = new double[sScore.dtm.getRowCount()];
for (int i = 0; i < avg.length; i++) {
avg[i] = (total[i] / 3.0);
sScore.jtb.setValueAt(String.format("%.2f", avg[i]), i, 5);
}
// 석차 구하기
int rank[] = new int[sScore.dtm.getRowCount()];
for (int i = 0; i < rank.length; i++) {
rank[i] = 1;
for (int j = 0; j < rank.length; j++) {
if (avg[i] < avg[j]) {
rank[i] += 1;
}
}
sScore.jtb.setValueAt(rank[i], i, 6);
}
}
// 샘플 3명 출력
public void sampleTable() {
String members[][] = {
{ "홍길동", "80", "75", "85", "240" },
{ "이성계", "90", "85", "80", "255" },
{ "강감찬", "70", "75", "70", "215" }
};
sScore.dtm.setDataVector(members, sScore.header);
}
// 테이블 지우기
public void clearTable() {
while (sScore.dtm.getRowCount() > 0) {
sScore.dtm.removeRow(0);
}
}
}