자바 - SungJukView

지환·2023년 10월 8일
0

JAVA

목록 보기
23/39
post-thumbnail

SungJukView

package com.calcc;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableModel;

public class SungJukView implements ActionListener {
	
	String col[] = { "이름", "오라클", "자바", "HTML", "총점", "평균", "학점", "석차" }; // 컬럼명
	Calclogic cal = new Calclogic(this);																		// 생성
	int p_num = 0; // 입력 받을 사람수 저장할 변수

	//선언부 에서 SungJukView 생성자 생성
	
	DefaultTableModel dtm;
	JTable table; // = new JTable(value, col); 테이블
	JScrollPane jsp; // = new JScrollPane(table); 스크롤

	JFrame jf_sungjuk = new JFrame();
	// JFrame에 붙일 속지 두 개 선언하고 생성하기
	JPanel jp_center = new JPanel();
	// 배치-jp_center 속지 중앙에 배치하자
	JPanel jp_north = new JPanel();
	JPanel jp_south = new JPanel();


	
	JButton jbt_clear = new JButton("전체 삭제");
	JButton jbt_selectDelRow = new JButton("선택 삭제");
	JButton jbt_add = new JButton("추가");
	
	
	//텍스트 입력창 선언
	JTextField jt_name = new JTextField(6);
	JTextField jt_oracle = new JTextField(6);
	JTextField jt_java = new JTextField(6);
	JTextField jt_html = new JTextField(6);
	
	JTextField total = new JTextField(6);
	JTextField avg = new JTextField(6);
	JTextField grade = new JTextField(6);
	JTextField rank = new JTextField(6);
	
	
	
	
	JButton jbt_process = new JButton("점수계산");
	JButton jbt_exit = new JButton("종료");
	

	public void initDisplay() {
		
		
		
		System.out.println("initDisplay 호출성공");

		jp_center.setLayout(new BorderLayout(0, 20));

		// 버튼 동작 등록
		
		jbt_clear.addActionListener(this); // 표지우기
		jbt_selectDelRow.addActionListener(this); //선택된 행만 지우기 
		jbt_process.addActionListener(this); // 처리
		jbt_add.addActionListener(this); // 처리
		jbt_exit.addActionListener(this); // 종료


		jp_north.add(jbt_selectDelRow);
		jp_north.add(jbt_clear);
		
		//텍스트 창 붙이기
		jp_south.add(jt_name);
		jp_south.add(jt_oracle);
		jp_south.add(jt_java);
		jp_south.add(jt_html);
		
		//텍스트 입력창 초기화 부분		
		jt_name.setText("");                    //이름 텍스트입력창 초기값
		jt_oracle.setText("");           //오라클 텍스트입력창 초기값
		jt_java.setText("");
		jt_html.setText("");
		
		//동작 버튼 붙이기
		jp_south.add(jbt_add);
		jp_south.add(jbt_process);
		jp_south.add(jbt_exit);
		
		dtm = new DefaultTableModel(col,0);            //디폴트 테이블 생성 col 배열에 있는 값들로 컬럼이름 하고, p_num만큼 밑에 행열 생성함
		table= new JTable(dtm);	                                    //테이블 생성(디폴트 테이블에 정해둔 값으로 생성됨)
		jsp=new JScrollPane(table);									//스크롤바 붙임
	    jp_center.add("Center",jsp);
	    jp_center.validate();
				
		jf_sungjuk.setBackground(new Color(214, 211, 206));

		// 속지 두 장을 JFrame에 붙이기
		jf_sungjuk.add("Center", jp_center);
		jf_sungjuk.add("South", jp_south);
		jf_sungjuk.add("North", jp_north);
		jf_sungjuk.setSize(600, 400);

		jf_sungjuk.setTitle("성적처리");// 메소드 구현할 때에는 타입이 오고 호출할 때에는 타입을 쓰지 않는다.
		// 호출 하는 거니까 타입이 필요가 없습니다.
		jf_sungjuk.setVisible(true);
	}

	@Override
	public void actionPerformed(ActionEvent ae) {
		
		//이벤트가 발생한 컴포넌트의 주소번지 가져오기 - 어떤 버튼을 눌렀나?
		Object obj = ae.getSource();
		

	if(obj==jbt_process)
	{
		//p_num=dtm.getRowCount();     //계산할때 인원수는 현재 테이블의 행 숫자이므로
		cal.calcTable();
	}
	
	
	else if(obj==jbt_add)
	{
		String input[] = new String[col.length];    //사용자값 저장할 배열 선언, col배열길이만큼
		input[0]=jt_name.getText();       //이름 input[0]에 저장
		input[1]=jt_oracle.getText();      //오라클점수
		input[2]=jt_java.getText();        //자바점수
		input[3]=jt_html.getText();      //html점수
		
		dtm.addRow(input);
		
		 //입력값 저장 하고 나서 텍스트입력 칸 다시 초기화 해두기
		jt_name.setText("");                 
		jt_oracle.setText("");
		jt_java.setText("");
		jt_html.setText("");
		
		
	}
	
	else if(obj==jbt_selectDelRow)
	{	//테이블 선택했을때 .getSelectedRow() 메소드 값은 그 행의 값이 나오고
		//아무것도 선택 안되어잇을때는 -1을 전달함.
		if(table.getSelectedRow()==-1) //-1일때(아무것도 선택되지 않았을때
		{										 //if문 탈출할때 return;을 사용함	
			return;                            //따라서 삭제 버튼 눌렀을때 아무일도 일어나지 않는다.
			                                    
		}
		else                                    //행이 선택되어있을때
		{
			dtm.removeRow(table.getSelectedRow());   //선택된 행값을 가져와서 삭제메소드실행
		}
			
	}
	else if(obj==jbt_clear)               //전체 삭제
	{

		for(int i = dtm.getRowCount(); i>0; i--)          //행갯수만큼 삭제메소드 반복실행
		{
			dtm.removeRow(0);
		}
		
	}
		
	else if(obj==jbt_exit)
	{
			System.exit(0); //자바 가상머신과 연결이 끊김
    }
}

	public SungJukView()
	{
		initDisplay();
	}
	public static void main(String[] args) {
		JFrame.setDefaultLookAndFeelDecorated(true);
		new SungJukView();
	}
}

이벤트처리

@Override
	public void actionPerformed(ActionEvent ae) {
		
		//이벤트가 발생한 컴포넌트의 주소번지 가져오기 - 어떤 버튼을 눌렀나?
		Object obj = ae.getSource();
		

	if(obj==jbt_process)
	{
		//p_num=dtm.getRowCount();     //계산할때 인원수는 현재 테이블의 행 숫자이므로
		cal.calcTable();
	}
	
	
	else if(obj==jbt_add)
	{
		String input[] = new String[col.length];    //사용자값 저장할 배열 선언, col배열길이만큼
		input[0]=jt_name.getText();       //이름 input[0]에 저장
		input[1]=jt_oracle.getText();      //오라클점수
		input[2]=jt_java.getText();        //자바점수
		input[3]=jt_html.getText();      //html점수
		
		dtm.addRow(input);
		
		 //입력값 저장 하고 나서 텍스트입력 칸 다시 초기화 해두기
		jt_name.setText("");                 
		jt_oracle.setText("");
		jt_java.setText("");
		jt_html.setText("");
		
		
	}
	
	else if(obj==jbt_selectDelRow)
	{	//테이블 선택했을때 .getSelectedRow() 메소드 값은 그 행의 값이 나오고
		//아무것도 선택 안되어잇을때는 -1을 전달함.
		if(table.getSelectedRow()==-1) //-1일때(아무것도 선택되지 않았을때
		{										 //if문 탈출할때 return;을 사용함	
			return;                            //따라서 삭제 버튼 눌렀을때 아무일도 일어나지 않는다.
			                                    
		}
		else                                    //행이 선택되어있을때
		{
			dtm.removeRow(table.getSelectedRow());   //선택된 행값을 가져와서 삭제메소드실행
		}
			
	}
	else if(obj==jbt_clear)               //전체 삭제
	{

		for(int i = dtm.getRowCount(); i>0; i--)          //행갯수만큼 삭제메소드 반복실행
		{
			dtm.removeRow(0);
		}
		
	}
		
	else if(obj==jbt_exit)
	{
			System.exit(0); //자바 가상머신과 연결이 끊김
    }
}

	public SungJukView()
	{
		initDisplay();
	}
	public static void main(String[] args) {
		JFrame.setDefaultLookAndFeelDecorated(true);
		new SungJukView();
	}
}

Calclogic

package com.calcc;

public class Calclogic {
	SungJukView sv = null; // NullPointException 방지
	public Calclogic(SungJukView sv)
	{
		this.sv = sv;
	}

	 public void calcTable() {
		    // 총점 구하기
		    int total[] = new int[sv.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(sv.table.getValueAt(i, j).toString());
		      }
		      sv.table.setValueAt(total[i], i, 4);
		    }
		 
		    // 평균 구하기
		    double avg[] = new double[sv.dtm.getRowCount()];
		    for (int i = 0; i < avg.length; i++) {
		      avg[i] = (total[i] / 3.0);
		      sv.table.setValueAt(String.format("%.4f", avg[i]), i, 5);
		      
		      if (90<avg[i])
		      {
		    	  String hint ="A+";
		    	  sv.table.setValueAt(String.format("%s", hint), i, 6);
		    			  
		      }
		      else if(85<avg[i] && avg[i] <= 90)
		      {
		    	  String hint ="A";
		    	  sv.table.setValueAt(String.format("%s", hint), i, 6);
		      }
		      
		      else if (75<avg[i] && avg[i]<=85)
		      {
		    	  String hint ="B+";
		    	  sv.table.setValueAt(String.format("%s", hint), i, 6);
		      }
		      else if (65<avg[i] && avg[i]<=75)
		      {
		    	  String hint ="C+";
		    	  sv.table.setValueAt(String.format("%s", hint), i, 6);
		      }
		      
		      else if (55<avg[i] && avg[i]<=65)
		      {
		    	  String hint ="C";
		    	  sv.table.setValueAt(String.format("%s", hint), i, 6);
		      }
		      
		      else
		      {
		    	  String hint ="F";
		    	  sv.table.setValueAt(String.format("%s", hint), i, 6);
		      }
		    }
		 // 학점 구하기
		    /*
		     * 평균을 구해서 -> 90< x --> A+
		     * 85<x<=90 --> A
		     * 75<x<= 85 --> B+
		     * 65 < x <=75 ---> C+
		     * 55 < x <=65 ----> C
		     * else -->F
		     */
		    
		    
		    
		    // 석차 구하기
		    int rank[] = new int[sv.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;
		        }
		      }
		      sv.table.setValueAt(rank[i], i, 7);
		    }
		    
		    
		    
		  }
		 

	
}

코드 분석

Step-1 total

  1. 필자가 구현하고자 하는 부분은 사용자로부터 입력을 받고 -> 추가를 누르면 정보가 입력되고 점수계산버튼을 눌렀을 때 사용자의 오라클,자바,HTML 계산하여 총점 , 평균, 학점, 석차를 구하는 것이다.

우선


	SungJukView sv = null; // NullPointException 방지
	public Calclogic(SungJukView sv)
	{
		this.sv = sv;
	}
  • Calclogic 생성자를 통해서 SungJukView에 대한 객체를 받아온다. (dtm, 사용자로부터 입력 받은 input 값들 받을 수 있음)
		    int total[] = new int[sv.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(sv.table.getValueAt(i, j).toString());
		      }
		      sv.table.setValueAt(total[i], i, 4);
		    }
  • sv.dtm.getRowCount()];이 부분이 GUI상 사용자로부터 입력 받은 값들에 대한 행의 개수를 구한 뒤, total 배열의 길이를 선언한다.

  • 이 기준으로 2중 for문을 돌린다. 당연히 제일 바깥쪽에 위치한 for문은 기준이 된다.

  • for (int j = 1; j <= 3; j++)에서 1부터 시작하는 이유는 이름을 제외해야 되기 때문이다.

(오라클 + 자바 + HTML)이 된다.

		      for (int j = 1; j <= 3; j++) {
		        System.out.println(total[i]);
		        total[i] += Integer.parseInt(sv.table.getValueAt(i, j).toString());
		      }
  • 안쪽 for문을 통해서 total[0]인 상태로 j값을 돌린다.

  • 중요한 부분은 getValueAt인데,

Integer.parseInt(sv.table.getValueAt(i, j).toString()) 

Integer.parseInt(sv.table.getValueAt(0, 1~3).toString())

해당 코드는 같은 의미이다. getValueAt으로 해당 테이블의 값들을 읽어온 후 total에 더한다.

toString은 기본적으로Object 클래스에서 상속받은 메소드로 객체를 문자열로 반환한다.

해당 줄에 toString을 한 이유는 toString() 메소드를 이용해서 문자열로 반환한 뒤(input[0] ~ input[4]까지 String 타입임) getValueAt(i,j)에서 얻은 값을 문자열로 반환한다.

sv.table.setValueAt(total[i], i, 4); 

그렇게 계산된 total 값을 setValueAt메소드를 통해서 값을 주입한다.

정리

total[0] --> Row 부분 고정 --> 안쪽 j 돌면서 total 계산

Step-2 avg

 double avg[] = new double[sv.dtm.getRowCount()];
		    for (int i = 0; i < avg.length; i++) {
		      avg[i] = (total[i] / 3.0);
		      sv.table.setValueAt(String.format("%.4f", avg[i]), i, 5);
		      
		      if (90<avg[i])
		      {
		    	  String hint ="A+";
		    	  sv.table.setValueAt(String.format("%s", hint), i, 6);
		    			  
		      }
		      else if(85<avg[i] && avg[i] <= 90)
		      {
		    	  String hint ="A";
		    	  sv.table.setValueAt(String.format("%s", hint), i, 6);
		      }
		      
		      else if (75<avg[i] && avg[i]<=85)
		      {
		    	  String hint ="B+";
		    	  sv.table.setValueAt(String.format("%s", hint), i, 6);
		      }
		      else if (65<avg[i] && avg[i]<=75)
		      {
		    	  String hint ="C+";
		    	  sv.table.setValueAt(String.format("%s", hint), i, 6);
		      }
		      
		      else if (55<avg[i] && avg[i]<=65)
		      {
		    	  String hint ="C";
		    	  sv.table.setValueAt(String.format("%s", hint), i, 6);
		      }
		      
		      else
		      {
		    	  String hint ="F";
		    	  sv.table.setValueAt(String.format("%s", hint), i, 6);
		      }
  • 해당 코드의 매커니즘도 동일하다.
for (int i = 0; i < avg.length; i++) {
		      avg[i] = (total[i] / 3.0);
		      sv.table.setValueAt(String.format("%.4f", avg[i]), i, 5);
		      

String.format이란? --> 설명참고하기

쉽게 말하면 String.format("%.4f",avg[i]) 의 값을 float형으로 변환 후 -> setValueAt으로 주입한다.

Step3

		    int rank[] = new int[sv.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;
		        }
		      }
		      sv.table.setValueAt(rank[i], i, 7);
		    }
  • rank[i] = 1; 초기에 모든 학생의 석차를 1로 초기화한다
    1로 초기화하는 이유는 모든 학생을 처음에는 1위로 설정한다.

  • 안쪽 반복문을 통해 현재 학생(i번째)과 다른 모든 학생(j번째)의 평균 점수를 비교한다.

  • if (avg[i] < avg[j]) { rank[i] += 1; }: 현재 학생(i번째)의 평균 점수(avg[i])가 다른 학생(j번째)의 평균 점수(avg[j])보다 작으면 현재 학생의 석차(rank[i])를 1 증가시킨다.

profile
아는만큼보인다.

0개의 댓글