본문 바로가기
학교/2-2학기(Java)

[텀프로젝트] 11/23 기록

by C0MPAS 2024. 11. 23.

11/22 코드

https://jh4995.tistory.com/634

 

[텀프로젝트] 11/22 기록

11/21 코드https://jh4995.tistory.com/633 [텀프로젝트] 11/21 기록11/19 코드https://jh4995.tistory.com/631 [텀프로젝트] 11/19 기록11/17 코드https://jh4995.tistory.com/629 [텀프로젝트] 11/17 기록11/16 코드https://jh4995.tistory

jh4995.tistory.com

 


11/23 코드

import java.util.*;
import java.util.List;
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MileageManager extends JFrame{
    HashMap<String, Integer> mileageMap = new HashMap<>();

    public static void main(String[] args) {
        System.out.println("*** 마일리지 관리 프로그램입니다.***");

        MileageManager manager = new MileageManager();        
        manager.get_Mileage_From_File();
        manager.control_Mileage();
        manager.highest_Mileage();
        //manager.show_GridLayout();
        manager.show_ImageGallery();
        
        System.out.println("프로그램을 종료합니다.");
    }
    
    
    // 1. mileage.txt 파일로부터 초기 마일리지 데이터 읽어오기
    public void get_Mileage_From_File() {
        try{
        	File file = new File("C:\\tempjava\\mileage.txt");
        	Scanner sc = new Scanner(file);
        	
            while (sc.hasNext())
            {
                String name = sc.next();
                if (name.equals("그만"))
                {
                	break;
                }
                int mileage = sc.nextInt();
                mileageMap.put(name, mileageMap.getOrDefault(name, 0) + mileage);
                // getOrDefault 메소드 추가 활용
            }
            sc.close();
        } 
        
        catch (FileNotFoundException e)
        {
        	System.out.println("FileNotFoundException");
        }
        catch (IOException e)
        {
            System.out.println("IOException");
        }
        catch (Exception e)
        {
        	System.out.println("Exception occured");
        }

        // 초기 마일리지 출력
        System.out.println("\n초기 마일리지 정보:");
        show_Mileage();
    }


    // 2. 마일리지 누적, 합산, 차감 / 새로운 이름과 마일리지 추가 / 검색 기능
    public void control_Mileage() {
       Scanner sc = new Scanner(System.in);
       
       while (true)
       {
           System.out.print("\n이름과 마일리지>> ");
           
           String name = sc.next();
           if(name.equals("그만"))
           {
        	   break;
           }
           int mileage = sc.nextInt();
           
           mileageMap.put(name, mileageMap.getOrDefault(name, 0) + mileage);
           // getOrDefault 메소드 추가 활용
       }

       // 최종 마일리지 출력
       System.out.println("\n최종 마일리지 정보:");
       show_Mileage();

       // 검색 기능
       while (true)
       {
           System.out.print("\n검색할 이름>> ");
           
           String name = sc.next();
           if (name.equals("그만"))
           {
        	   break;
           }
           Integer mileage = mileageMap.get(name);
           
           if (mileage == null)
           {
               System.out.println(name + " 고객은 마일리지가 없습니다.");
           } 
           else
           {
               System.out.println(name + "의 마일리지: " + mileage);
           }
       }       
       sc.close();
    }


    // 3. (이름:마일리지) 형태로 모든 마일리지 정보 출력
    public void show_Mileage() {
    	Set<String> keys = mileageMap.keySet();
    	Iterator<String> it = keys.iterator();
    	while(it.hasNext())
    	{
    		String name = it.next();
    		Integer mileage = mileageMap.get(name);
    		System.out.print("(" + name + ":" + mileage +")");
    	}		
        System.out.println();
    }

    
    // 4. 검색까지 종료된 이후, 프로그램 종료 전에, 가장 마일리지가 높은 고객을 출력
    public void highest_Mileage() {
    	int maxMileage = Collections.max(mileageMap.values());
    	String maxName = null;
    	for(String name : mileageMap.keySet())
    	{
    		if(mileageMap.get(name) == maxMileage)
    		{
    			maxName = name;
    			break;
    		}
    	}   	
    	System.out.println("\n가장 마일리지가 높은 고객은 " + maxName + "입니다.");
    }
    
     
    // 5. GridLayout을 이용해서 출력
    public void show_GridLayout() {
    	setTitle("최종 마일리지 정보");
    	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	
    	/*
    	GridLayout grid = new GridLayout(mileageMap.size()+1, 2);
    	grid.setVgap(5);
    	
    	Container c = getContentPane();
    	c.setLayout(grid);
    	c.add(new JLabel("고객 이름"));
    	c.add(new JLabel("마일리지"));
    	
    	// entrySet() 추가 활용
    	for(Map.Entry<String, Integer> entry : mileageMap.entrySet())
    	{
    		c.add(new JLabel(entry.getKey()));
    		c.add(new JLabel(String.valueOf(entry.getValue())));
    	}
    	*/
    	
    	GridLayout grid = new GridLayout(mileageMap.size()+1, 2, 5, 5);
    	grid.setVgap(5);

        Container c = getContentPane();
        c.setLayout(grid);
        c.add(new JLabel("고객 이름"));
    	c.add(new JLabel("마일리지"));

        for (Map.Entry<String, Integer> entry : mileageMap.entrySet()) 
        {
            JCheckBox checkBox = new JCheckBox(entry.getKey());
            JLabel mileageLabel = new JLabel(""); 

            checkBox.addItemListener(new ItemListener() {
                @Override
                public void itemStateChanged(ItemEvent e) {
                    if (checkBox.isSelected())
                    {
                        mileageLabel.setText(String.valueOf(entry.getValue()));
                    } 
                    else
                    {
                        mileageLabel.setText("");
                    }
                }
            });

            c.add(checkBox);
            c.add(mileageLabel);
        }
    	
    	setSize(400, 300);
    	setVisible(true);
    }
    

    
    // 6. 이미지 갤러리 구현
    Iterator<Map.Entry<String, Integer>> iterator;
    Map.Entry<String, Integer> currentEntry;

    JLabel nameLabel; // 고객 이름과 마일리지를 표시할 레이블
    JLabel imageLabel; // 메달 이미지를 표시할 레이블
    JButton leftButton, rightButton; // 좌우 화살표 버튼
    
    public void show_ImageGallery() {
        setTitle("최종 마일리지 정보");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container c = getContentPane();
        c.setLayout(new BorderLayout());

        nameLabel = new JLabel("", SwingConstants.CENTER);
        nameLabel.setFont(new Font("맑은 고딕", Font.BOLD, 20));
        c.add(nameLabel, BorderLayout.NORTH);

        imageLabel = new JLabel("", SwingConstants.CENTER);
        c.add(imageLabel, BorderLayout.CENTER);

        MenuPanel menuPanel = new MenuPanel();
        c.add(menuPanel, BorderLayout.SOUTH);

        iterator = mileageMap.entrySet().iterator();
        if (iterator.hasNext())
        {
            currentEntry = iterator.next();
            updateInfo();
        }

        setSize(400, 500);
        setVisible(true);
    }

    // 고객 이름과 마일리지 및 이미지 업데이트
    public void updateInfo() {
        if (currentEntry == null)
        {
        	return;
        }

        String name = currentEntry.getKey();
        int mileage = currentEntry.getValue();
        nameLabel.setText(name + " : " + mileage);

        String mileageGrade;
        if (mileage < 1000)
        {
            mileageGrade = "images/bronze.png";
        } 
        else if (1000 <= mileage && mileage < 3000) 
        {
            mileageGrade = "images/silver.png"; 
        } 
        else 
        {
            mileageGrade = "images/gold.png";
        }

        imageLabel.setIcon(new ImageIcon(mileageGrade));
    }

    // 좌우 화살표 버튼 구현
    class MenuPanel extends JPanel {
        public MenuPanel() {
            setLayout(new GridLayout(1, 2, 10, 10));

            leftButton = new JButton(new ImageIcon("images/left_arrow.png"));
            leftButton.addActionListener(new ActionListener() 
            {
                @Override
                public void actionPerformed(ActionEvent e) 
                {
                    moveToLeft();
                }
            });
            add(leftButton);

            rightButton = new JButton(new ImageIcon("images/right_arrow.png"));
            rightButton.addActionListener(new ActionListener() 
            {
                @Override
                public void actionPerformed(ActionEvent e) 
                {
                    moveToRight();
                }
            });
            add(rightButton);
        }
        
        private void moveToLeft() {
            List<Map.Entry<String, Integer>> entryList = new ArrayList<>(mileageMap.entrySet());
            int index = entryList.indexOf(currentEntry);
            if (index > 0) 
            {
                currentEntry = entryList.get(index - 1);
                updateInfo();
            }
        }

        private void moveToRight() {
            List<Map.Entry<String, Integer>> entryList = new ArrayList<>(mileageMap.entrySet());
            int index = entryList.indexOf(currentEntry);
            if (index < entryList.size() - 1) 
            {
                currentEntry = entryList.get(index + 1);
                updateInfo();
            }
        }
    }
   
}

11/23 제출 코드

- JCheckBox와 이미지 갤러리를 구현한다

 

- itemStateChanged를 오버라이딩 하여서, if-else를 통해서 체크박스가 선택된 경우와 선택되지 않은 경우를 나눈다.

- 체크박스가 선택된 경우에는 HashMap으로부터 마일리지값을 받아와서 출력한다.

- 하지만 체크박스가 선택되지 않은 경우에는 아무것도 출력하지 않는다.

 

- 이미지 갤러리를 구현하기 위해서는 컨텐트팬의 배치관리자를 BorderLayout 배치관리자로 설정한다.

  그리고 크게 NORTH, CENTER, SOUTH 영역으로 나누어서 진행을 해야한다.

- NORTH 영역에서는 고객 이름과 마일리지를 표시하기 위해서 JLabelnameLabel을 활용한다.

- CENTER 영역에서는 매달 이미지를 표시하기 위해서 JLabelimeageLabel로 추가한다.

- SOUTH 영역에서는 좌우 화살표 버튼을 구현하기 위해서 JButtonleftButtonrightButton을 활용한다.

 

- 하지만 main 안에서 2개의 메서드를 동시에 실행하는 경우에는 2가지 실행결과가 겹쳐서 출력되는 상황이다.

- 향후에 JMenuBar, JMenu 등을 사용해서 서로 다른 GUI창을 통해서 분리해서 표현할 수 있도록 수정할 예정이다.

import java.util.*;
import java.util.List;
import java.io.*;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class MileageManager extends JFrame{
    HashMap<String, Integer> mileageMap = new HashMap<>();

    public static void main(String[] args) {
        System.out.println("*** 마일리지 관리 프로그램입니다.***");

        MileageManager manager = new MileageManager();        
        manager.get_Mileage_From_File();
        manager.control_Mileage();
        manager.highest_Mileage();
        //manager.show_GridLayout();
        manager.show_ImageGallery();
        
        System.out.println("프로그램을 종료합니다.");
    }
    
    
    // 1. mileage.txt 파일로부터 초기 마일리지 데이터 읽어오기
    public void get_Mileage_From_File() {
        try{
        	File file = new File(".\\mileage.txt");
        	Scanner sc = new Scanner(file);
        	
            while (sc.hasNext())
            {
                String name = sc.next();
                if (name.equals("그만"))
                {
                	break;
                }
                int mileage = sc.nextInt();
                mileageMap.put(name, mileageMap.getOrDefault(name, 0) + mileage);
                // getOrDefault 메소드 추가 활용
            }
            sc.close();
        } 
        
        catch (FileNotFoundException e)
        {
        	System.out.println("FileNotFoundException");
        }
        catch (IOException e)
        {
            System.out.println("IOException");
        }
        catch (Exception e)
        {
        	System.out.println("Exception occured");
        }

        // 초기 마일리지 출력
        System.out.println("\n초기 마일리지 정보:");
        show_Mileage();
    }


    // 2. 마일리지 누적, 합산, 차감 / 새로운 이름과 마일리지 추가 / 검색 기능
    public void control_Mileage() {
       Scanner sc = new Scanner(System.in);
       
       while (true)
       {
           System.out.print("\n이름과 마일리지>> ");
           
           String name = sc.next();
           if(name.equals("그만"))
           {
        	   break;
           }
           int mileage = sc.nextInt();
           
           mileageMap.put(name, mileageMap.getOrDefault(name, 0) + mileage);
           // getOrDefault 메소드 추가 활용
       }

       // 최종 마일리지 출력
       System.out.println("\n최종 마일리지 정보:");
       show_Mileage();

       // 검색 기능
       while (true)
       {
           System.out.print("\n검색할 이름>> ");
           
           String name = sc.next();
           if (name.equals("그만"))
           {
        	   break;
           }
           Integer mileage = mileageMap.get(name);
           
           if (mileage == null)
           {
               System.out.println(name + " 고객은 마일리지가 없습니다.");
           } 
           else
           {
               System.out.println(name + "의 마일리지: " + mileage);
           }
       }       
       sc.close();
    }


    // 3. (이름:마일리지) 형태로 모든 마일리지 정보 출력
    public void show_Mileage() {
    	Set<String> keys = mileageMap.keySet();
    	Iterator<String> it = keys.iterator();
    	while(it.hasNext())
    	{
    		String name = it.next();
    		Integer mileage = mileageMap.get(name);
    		System.out.print("(" + name + ":" + mileage +")");
    	}		
        System.out.println();
    }

    
    // 4. 검색까지 종료된 이후, 프로그램 종료 전에, 가장 마일리지가 높은 고객을 출력
    public void highest_Mileage() {
    	int maxMileage = Collections.max(mileageMap.values());
    	String maxName = null;
    	for(String name : mileageMap.keySet())
    	{
    		if(mileageMap.get(name) == maxMileage)
    		{
    			maxName = name;
    			break;
    		}
    	}   	
    	System.out.println("\n가장 마일리지가 높은 고객은 " + maxName + "입니다.");
    }
    
     
    // 5. GridLayout을 이용해서 출력
    public void show_GridLayout() {
    	setTitle("최종 마일리지 정보");
    	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	
    	GridLayout grid = new GridLayout(mileageMap.size()+1, 2, 5, 5);
    	grid.setVgap(5);

        Container c = getContentPane();
        c.setLayout(grid);
        c.add(new JLabel("고객 이름"));
    	c.add(new JLabel("마일리지"));

        for (Map.Entry<String, Integer> entry : mileageMap.entrySet()) 
        {
            JCheckBox checkBox = new JCheckBox(entry.getKey());
            JLabel mileageLabel = new JLabel(""); 

            checkBox.addItemListener(new ItemListener() {
                @Override
                public void itemStateChanged(ItemEvent e) {
                    if (checkBox.isSelected())
                    {
                        mileageLabel.setText(String.valueOf(entry.getValue()));
                    } 
                    else
                    {
                        mileageLabel.setText("");
                    }
                }
            });

            c.add(checkBox);
            c.add(mileageLabel);
        }
    	
    	setSize(400, 300);
    	setVisible(true);
    }
    

    
    // 6. 이미지 갤러리 구현
    Iterator<Map.Entry<String, Integer>> iterator;
    Map.Entry<String, Integer> currentEntry;

    JLabel nameLabel; 
    JLabel imageLabel; 
    JButton leftButton, rightButton; 
    
    public void show_ImageGallery() {
        setTitle("최종 마일리지 정보");
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Container c = getContentPane();
        c.setLayout(new BorderLayout());

        nameLabel = new JLabel("", SwingConstants.CENTER);
        nameLabel.setFont(new Font("맑은 고딕", Font.BOLD, 20));
        c.add(nameLabel, BorderLayout.NORTH);

        imageLabel = new JLabel("", SwingConstants.CENTER);
        c.add(imageLabel, BorderLayout.CENTER);

        MenuPanel menuPanel = new MenuPanel();
        c.add(menuPanel, BorderLayout.SOUTH);

        iterator = mileageMap.entrySet().iterator();
        if (iterator.hasNext())
        {
            currentEntry = iterator.next();
            updateInfo();
        }

        setSize(400, 500);
        setVisible(true);
    }

    // 고객 이름과 마일리지 및 이미지 업데이트
    public void updateInfo() {
        if (currentEntry == null)
        {
        	return;
        }

        String name = currentEntry.getKey();
        int mileage = currentEntry.getValue();
        nameLabel.setText(name + " : " + mileage);

        String mileageGrade;
        if (mileage < 1000)
        {
            mileageGrade = "images/bronze.png";
        } 
        else if (1000 <= mileage && mileage < 3000) 
        {
            mileageGrade = "images/silver.png"; 
        } 
        else 
        {
            mileageGrade = "images/gold.png";
        }

        imageLabel.setIcon(new ImageIcon(mileageGrade));
    }

    // 좌우 화살표 버튼 구현
    class MenuPanel extends JPanel {
        public MenuPanel() {
            setLayout(new GridLayout(1, 2, 10, 10));

            leftButton = new JButton(new ImageIcon("images/left_arrow.png"));
            leftButton.addActionListener(new ActionListener() 
            {
                @Override
                public void actionPerformed(ActionEvent e) 
                {
                    moveToLeft();
                }
            });
            add(leftButton);

            rightButton = new JButton(new ImageIcon("images/right_arrow.png"));
            rightButton.addActionListener(new ActionListener() 
            {
                @Override
                public void actionPerformed(ActionEvent e) 
                {
                    moveToRight();
                }
            });
            add(rightButton);
        }
        
        private void moveToLeft() {
            List<Map.Entry<String, Integer>> entryList = new ArrayList<>(mileageMap.entrySet());
            int index = entryList.indexOf(currentEntry);
            if (index > 0) 
            {
                currentEntry = entryList.get(index - 1);
                updateInfo();
            }
        }

        private void moveToRight() {
            List<Map.Entry<String, Integer>> entryList = new ArrayList<>(mileageMap.entrySet());
            int index = entryList.indexOf(currentEntry);
            if (index < entryList.size() - 1) 
            {
                currentEntry = entryList.get(index + 1);
                updateInfo();
            }
        }
    }
   
}

'학교 > 2-2학기(Java)' 카테고리의 다른 글

[13주차] 11/25(월) 강의내용  (0) 2024.11.25
[텀프로젝트] 11/24 기록  (0) 2024.11.24
[텀프로젝트] 11/22 기록  (0) 2024.11.22
[텀프로젝트] 11/21 기록  (0) 2024.11.21
[12주차] 11/20(수) 강의내용  (1) 2024.11.20

댓글