|
순번 | 테스트 케이스 | 테스트 결과 |
1 | 객체 저장하기 | 통과 |
2 | 객체 읽어오기 | 통과 |
3 | 자료삭제(Delete기능) | 통과 |
4 | Table입력행 입력필드 반영여부 | 통과 |
5 | 수정하기 | 통과 |
6 | 갱신자료 저장경고 | 통과 |
7 | 학번으로 자료찾기 | 통과 |
8 | 석차구하기(객체정렬) | 통과 |
9 | 전교생 성적(막대) 그래프 | 통과 |
10 | 예외화면 구현 | 미통과 |
3. 작성코드
[MyGraphFactory]--------------------------------------------
package gwaze;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
// 공장 -> 기계
public class MyGraphFactory {
// 어떤 자료를 받아 막대그래프가 그려진 패널을 리턴시켜주는 기계
public static JPanel getHistogram(final int[] scores, final String[] names) {
JPanel panel = new JPanel() {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// 받은 성적과 이름을 바탕으로 막대그래프를 그린다.
for (int i = 0; i < scores.length; i++) {
g.fillRect(10 + (50 * i), 300 - scores[i], 20, scores[i]);
g.drawString(names[i], 10 + (50 * i), 320);// 320~글자의 좌측 하단점(y)
}
}
};
return panel;
}
// 주파수와 진폭을 입력받아 사인curve가 그려진 패널을 리턴시켜주는 기계
public static JPanel getSinePanel(final double 진폭, final double 주파수) {
JPanel panel = new JPanel() {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(0, 200, 720, 200);
for (int x = 0; x <= 720; x++) {
int y = (int) (진폭 * -(Math.sin( // '-' 수학국면과 컴퓨터 국면이 반대로
Math.toRadians((double) x * 주파수)) * 200) // 뻥튀기
+ 200 // 안보이는 영역 끌어내리기
);
g.fillOval(x, y, 3, 3);
}
}
};
return panel;
}
// 사인함수 합성 기계 (기본사이클에 합성)
public static JPanel getPlusPanel(final double 진폭, final double 주파수) {
JPanel panel = new JPanel() {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(0, 200, 720, 200);
for (int x = 0; x <= 720; x++) {
int y0 = (int) (-(Math.sin( // '-' 수학국면과 컴퓨터 국면이 반대로
Math.toRadians((double) x)) * 200) // 뻥튀기
+ 200 // 안보이는 영역 끌어내리기
);
int y = (int) (진폭 * -(Math.sin( // '-' 수학국면과 컴퓨터 국면이 반대로
Math.toRadians((double) x * 주파수)) * 200) // 뻥튀기
+ 200 // 안보이는 영역 끌어내리기
);
g.fillOval(x, y0 + y, 3, 3);
}
}
};
return panel;
}
public static JPanel getPieGraph(final int[] scores, final String[] names, final Color[] colors) {
JPanel panel = new JPanel() {
{
this.setLayout(null);
this.setSize(1024, 768);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
// 파이그래프 그리는 작업
int total = 0;
for (int x : scores) {
total += x;
}
// 차지할 각도 계산
int[] changeScores = new int[scores.length];
for (int i = 0; i < scores.length; i++) {
changeScores[i] = (int) ((scores[i] / (double) total) * 360);
}
int startAngle = 0;// 누산
for (int i = 0; i < scores.length; i++) {
g.setColor(colors[i]);
g.fillArc(10, 10, 300, 300, startAngle, changeScores[i]);
startAngle += changeScores[i];
}
String[][] conts = new String[names.length][3];
for (int i = 0; i < conts.length; i++) {
conts[i][0] = scores[i] + "";
conts[i][1] = (int) (scores[i] / (double) total * 100) + "%";
conts[i][2] = (int) (scores[i] / (double) total * 360) + "º";
}
JPanel legend = MyGraphFactory.getTable(names, conts, colors);
this.add(legend);
legend.setBounds(350, 10, names.length * 100 + 20, 400);
}
};
return panel;
}
// 표 얻는 기계
public static JPanel getTable(String[] titles, String[][] contents, Color[] colors) {
JPanel panel = new JPanel() {
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setFont(new Font("고딕체", Font.BOLD, 20));
int boxWidth = titles.length * 100;
int boxHeight = contents.length * 40;
for (int i = 10; i <= boxWidth + 10; i += 100) {
g.drawLine(i, 10, i, boxHeight + 10 + 40);
}
for (int i = 10; i <= boxHeight + 10 + 40; i += 40) {
g.drawLine(10, i, boxWidth + 10, i);
}
for (int i = 0; i < titles.length; i++) {
g.setColor(Color.BLACK);
g.drawString(titles[i], 20 + (i * 100), 40);
g.setColor(colors[i]);
for (int j = 0; j < contents[i].length; j++) {
g.drawString(contents[i][j], 20 + (i * 100), 40 + (j * 40) + 40);
}
}
}
};
return panel;
}
}
-----------------------------------------------------------
[TestGFFrame]
package gwaze;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.table.DefaultTableModel;
import com.sjw.membership.MyMember;
import javax.swing.JSplitPane;
import javax.swing.AbstractButton;
import javax.swing.JButton;
import javax.swing.JTextField;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Vector;
import java.awt.event.ActionEvent;
import javax.swing.event.AncestorListener;
import javax.swing.event.AncestorEvent;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
public class TestGFFrame extends JFrame {
private JPanel contentPane;
private final JTextField txtDtestscoresobj = new JTextField();
private JTextField tfNo;
private JTextField tfName;
private JTextField tfKor;
private JTextField tfEng;
private JTextField tfMath;
private JTable table;
private JPanel graphPanel = new JPanel();
private ArrayList<MyScore> data =
new ArrayList<>();
private DefaultTableModel dtm = new DefaultTableModel() ;
{
dtm.setColumnIdentifiers(new String[] {
"학번","이름","국어","영어","수학","총점","평균","석차"
});
}
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TestGFFrame frame = new TestGFFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public TestGFFrame() {
setTitle(" ");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 756, 498);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JSplitPane splitPane = new JSplitPane();
splitPane.setOneTouchExpandable(true);
contentPane.add(splitPane, BorderLayout.CENTER);
JSplitPane splitPane_1 = new JSplitPane();
splitPane_1.setOneTouchExpandable(true);
splitPane_1.setOrientation(JSplitPane.VERTICAL_SPLIT);
splitPane.setLeftComponent(splitPane_1);
JPanel panel = new JPanel();
panel.setBackground(Color.yellow);
splitPane_1.setLeftComponent(panel);
panel.setLayout(null);
tfNo = new JTextField();
tfNo.setToolTipText("\uD559\uBC88");
tfNo.setBounds(111, 10, 116, 21);
panel.add(tfNo);
tfNo.setColumns(10);
tfName = new JTextField();
tfName.setBounds(111, 41, 116, 21);
panel.add(tfName);
tfName.setColumns(10);
tfKor = new JTextField();
tfKor.setBounds(111, 72, 116, 21);
panel.add(tfKor);
tfKor.setColumns(10);
tfEng = new JTextField();
tfEng.setBounds(111, 103, 116, 21);
panel.add(tfEng);
tfEng.setColumns(10);
tfMath = new JTextField();
tfMath.setBounds(111, 134, 116, 21);
panel.add(tfMath);
tfMath.setColumns(10);
JLabel label = new JLabel("\uD559\uBC88");
label.setBounds(22, 13, 57, 15);
panel.add(label);
JLabel lblNewLabel = new JLabel("\uC774\uB984");
lblNewLabel.setBounds(22, 44, 57, 15);
panel.add(lblNewLabel);
JLabel lblNewLabel_1 = new JLabel("\uAD6D\uC5B4");
lblNewLabel_1.setBounds(22, 75, 57, 15);
panel.add(lblNewLabel_1);
JLabel lblNewLabel_2 = new JLabel("\uC601\uC5B4");
lblNewLabel_2.setBounds(22, 106, 57, 15);
panel.add(lblNewLabel_2);
JLabel lblNewLabel_3 = new JLabel("\uC218\uD559");
lblNewLabel_3.setBounds(22, 137, 57, 15);
panel.add(lblNewLabel_3);
JButton btnNewButton_7 = new JButton("\uC790\uB8CC\uCD94\uAC00");
btnNewButton_7.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
// 입력된 성적을 자료에(data)에 넣기
String no = tfNo.getText();
String name = tfName.getText();
int kor = Integer.parseInt(tfKor.getText());
int eng = Integer.parseInt(tfEng.getText());
int math = Integer.parseInt(tfMath.getText());
MyScore score = new MyScore(
no,name,kor,eng,math
);
// arraylist에 반영
data.add(score);
Vector rowData = new Vector();
rowData.add(no);
rowData.add(name);
rowData.add(kor);
rowData.add(eng);
rowData.add(math);
rowData.add(score.getTotal());
rowData.add(score.getAvg());
rowData.add(score.getRank());
// jtable에 반영
dtm.addRow(rowData);
}
});
btnNewButton_7.setBounds(238, 133, 97, 23);
panel.add(btnNewButton_7);
JButton btnNewButton_8 = new JButton("\uADF8\uB798\uD504\uBCF4\uAE30");
btnNewButton_8.addActionListener(
e->{
String[] titles = new String[] {"국어","영어","수학"};
int[] scores = new int[]{
Integer.parseInt(tfKor.getText()),
Integer.parseInt(tfEng.getText()),
Integer.parseInt(tfMath.getText()),
};
Color[] colors = new Color[] {Color.red, Color.blue,Color.black};
graphPanel = MyGraphFactory.getPieGraph(scores, titles, colors);
splitPane.remove(graphPanel);
splitPane.setRightComponent(graphPanel);
}
);
btnNewButton_8.setBounds(238, 102, 105, 23);
panel.add(btnNewButton_8);
JPanel panel_3 = new JPanel();
panel_3.setBackground(Color.green);
panel_3.setBounds(12, 10, 67, 145);
panel.add(panel_3);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBackground(Color.GREEN);
splitPane_1.setRightComponent(scrollPane);
table = new JTable(dtm);
scrollPane.setViewportView(table);
splitPane_1.setDividerLocation(170);
graphPanel = new JPanel();
splitPane.setRightComponent(graphPanel);
splitPane.setDividerLocation(350);
JPanel panel_1 = new JPanel();
panel_1.setBackground(Color.gray);
contentPane.add(panel_1, BorderLayout.NORTH);
txtDtestscoresobj.setText("d:/test/scores.obj");
panel_1.add(txtDtestscoresobj);
txtDtestscoresobj.setColumns(20);
JButton btnNewButton_4 = new JButton("\uC800\uC7A5\uD558\uAE30");
btnNewButton_4.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 객체저장하기
try {
File file = new File(txtDtestscoresobj.getText());
// 빨대가공 - 여러 단계로 가공 (데코레이션 패턴)
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
ObjectOutputStream oos = new ObjectOutputStream(bos);
//
oos.writeObject(data);
oos.close();
JOptionPane.showMessageDialog(null, "자료저장완료~~");
btnNewButton_4.setBackground(null);
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
panel_1.add(btnNewButton_4);
JButton btnNewButton_5 = new JButton("\uC77D\uC5B4\uC624\uAE30");
btnNewButton_5.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// 객체 읽어오기
try {
File file = new File(txtDtestscoresobj.getText());
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
ObjectInputStream ois = new ObjectInputStream(bis);
data = (ArrayList<MyScore>) ois.readObject();
ois.close();
// jtable 에 있는 데이타 지우기
int size = dtm.getRowCount();
for(int i=0; i<size; i++) {
dtm.removeRow(0); // 주의
}
// 읽어온 데이타를 jtable에 반영
for(int i=0; i<data.size(); i++) {
Vector<String> rowData = new Vector<String>();
rowData.add(data.get(i).getNo()); // 관리번호
rowData.add(data.get(i).getName());
rowData.add(""+data.get(i).getKor());
rowData.add(""+data.get(i).getEng());
rowData.add(""+data.get(i).getMath());
rowData.add(""+data.get(i).getTotal());
rowData.add(""+data.get(i).getAvg());
rowData.add(""+data.get(i).getRank());
dtm.addRow(rowData);
}
JOptionPane.showMessageDialog(null, "데이타 로딩 완료");
} catch (FileNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} catch (ClassNotFoundException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
});
panel_1.add(btnNewButton_5);
JPanel panel_2 = new JPanel();
panel_2.setBackground(Color.green);
contentPane.add(panel_2, BorderLayout.SOUTH);
JButton btnNewButton = new JButton("석차구하기");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
List<Temp> temps = new ArrayList<>();
for(MyScore x:data) {
temps.add(new Temp(x.getNo(),x.getTotal()));
}
Collections.sort(temps);
for(int i=0; i<data.size(); i++) {
MyScore score = data.get(i);
int rank = getRank(score.getNo(),temps);
score.setRank(rank);
dtm.setValueAt(rank, i, 7);
}
}
});
panel_2.add(btnNewButton);
JButton btnNewButton_1 = new JButton("\uC0AD\uC81C\uD558\uAE30");
btnNewButton_1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//
int idx = table.getSelectedRow(); // 선택된게 없으면 -1
if(idx >= 0) {
dtm.removeRow(idx);
data.remove(idx);
btnNewButton.setBackground(Color.RED);
} else {
// 경고
JOptionPane.showMessageDialog(null, "지울 행이 선택되지 않았습니다.");
}
}
});
panel_2.add(btnNewButton_1);
JButton btnNewButton_2 = new JButton("\uC218\uC815\uD558\uAE30");
btnNewButton_2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
int idx = table.getSelectedRow();
String no = tfNo.getText();
String name = tfName.getText();
int kor = Integer.parseInt(tfKor.getText());
int eng = Integer.parseInt(tfEng.getText());
int math = Integer.parseInt(tfMath.getText());
MyScore score = new MyScore(no, name, kor, eng, math);
data.set(idx, score);
dtm.setValueAt(score.getNo(), idx, 0);
dtm.setValueAt(score.getName(), idx, 1);
dtm.setValueAt(score.getKor(), idx, 2);
dtm.setValueAt(score.getEng(), idx, 3);
dtm.setValueAt(score.getMath(), idx, 4);
// ------ 객체가 생성될때에 자동으로 값이 생성되는 부분
dtm.setValueAt(score.getTotal(), idx, 5);
dtm.setValueAt(score.getAvg(), idx, 6);
dtm.setValueAt(score.getRank(), idx, 7);
btnNewButton.setBackground(Color.RED);
}
});
panel_2.add(btnNewButton_2);
JButton btnNewButton_3 = new JButton("\uCC3E\uAE30\uAE30\uB2A5");
btnNewButton_3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
// TODO 찾는 기능 - 학번을 입력받아 그 자료를 텍스트필드
// 에 뿌려주고 테이블에 해당되는 줄에 하이라이트 되게
String no = JOptionPane.showInputDialog("찾을 학번을 입력하세요");
for(int i=0; i<dtm.getRowCount(); i++) {
if(dtm.getValueAt(i, 0).equals(no)) {
tfNo.setText(""+dtm.getValueAt(i, 0));
tfName.setText(""+dtm.getValueAt(i, 1));
tfKor.setText(""+dtm.getValueAt(i, 2));
tfEng.setText(""+dtm.getValueAt(i, 3));
tfMath.setText(""+dtm.getValueAt(i, 4));
table.setRowSelectionInterval(i, i);
break;
}
}
}
});
panel_2.add(btnNewButton_3);
JButton btnNewButton_6 = new JButton("\uC804\uCCB4\uADF8\uB798\uD504");
btnNewButton_6.addActionListener(
// 전체학생 성취도 그래프(막대그래프로)
e -> {
int[] scores = new int[dtm.getRowCount()];
String[] names = new String[dtm.getRowCount()];
for(int i=0; i<data.size(); i++) {
scores[i] = data.get(i).getTotal();
names[i] = data.get(i).getName();
}
graphPanel = MyGraphFactory.getHistogram(scores,names);
splitPane.remove(graphPanel);
splitPane.setRightComponent(graphPanel);
});
panel_2.add(btnNewButton_6);
}
class Temp implements Comparable<Temp> {
String no;
int total;
public Temp(String no, int total) {
super();
this.no = no;
this.total = total;
}
@Override
public int compareTo(Temp o) {
if(this.total > o.total) {
return -1;
} else if(this.total == o.total) {
return 0;
} else {
return 1;
}
}
}
// 학번과 정렬된 리스트를 입력받아
int getRank(String no, List<Temp> list) {
int rank = 0;
for(int i=0; i<list.size(); i++) {
if((list.get(i)).no.equals(no)) {
rank = i+1;
break;
}
}
return rank;
}
}
--- - -[MyScore]-------------------------------------------- ---
package gwaze;
import java.io.Serializable;
public class MyScore implements Serializable{
private static final long serialVersionUID = 1L;
private String no;
private String name;
private int kor;
private int eng;
private int math;
private int total;
private double avg;
private int rank;
public MyScore() {
super();
}
public MyScore(String no, String name, int kor, int eng, int math) {
super();
this.no = no;
this.name = name;
this.kor = kor;
this.eng = eng;
this.math = math;
this.total = kor + eng + math;
this.avg = total / 3.0;
this.rank = 0;
}
@Override
public String toString() {
return "MyScore [no=" + no + ", name=" + name + ", kor=" + kor + ", eng=" + eng + ", math=" + math + "]";
}
public String getNo() {
return no;
}
public void setNo(String no) {
this.no = no;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public double getAvg() {
return avg;
}
public void setAvg(double avg) {
this.avg = avg;
}
public int getRank() {
return rank;
}
public void setRank(int rank) {
this.rank = rank;
}
}
--------------------------------------------------------------
4.실행화면 캡처
[ 그래프 보기 ]
[저장하기]
[기본화면]
[ 읽어오기 ]
[석차구하기]
[ 수정하기 ]
[ 자료추가 ]
[전체그래프]
[찾기기능]