본문 바로가기
Programming/JAVA

스레드와 멀티태스킹, 고급 스윙 컴포넌트

by 안녕주 2020. 12. 30.

명품자바프로그래밍 chapter14_lab12

 

실습1| 메뉴, 툴팁, 팝업 다이얼로그, 컬러 다이얼로그, 다이얼로그

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class SwingTest extends JFrame{
	JLabel text = new JLabel("Text"); //글씨 기본 세팅 값 은 Text
	
	public SwingTest() {
		setTitle("Menu 만들기 예제");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //창 닫기
		Container c = getContentPane();
		
		text.setHorizontalAlignment(SwingConstants.CENTER); //가운데 글씨가 위치하도록 설정
		c.add(text,BorderLayout.NORTH); //위치지정 North에 오도록
		createMenu(); //메뉴 생성, 프레임에 삽입 
		setSize(300,200);
		setVisible(true);
	}
	
	public void createMenu() {
		JMenuBar mb = new JMenuBar(); //menubar 생성
		
		JMenuItem [] menuItem1 = new JMenuItem[3]; 
		String[] fileItem = {"열기","저장","종료"};
		JMenu fileMenu = new JMenu("파일"); //큰 제목 (파일)
		
		FileActionListener listener1 = new FileActionListener();
		for(int i=0;i<menuItem1.length;i++) { //3개의 메뉴 아이템을 파일에 삽입한다.
			menuItem1[i] = new JMenuItem(fileItem[i]);
			menuItem1[i].addActionListener(listener1);
			if (i == 2) //만약에 i==2일 때
				fileMenu.addSeparator(); //분리선 삽입
			fileMenu.add(menuItem1[i]);
		}
		
		
		//편집 메뉴
		JMenuItem [] menuItem2 = new JMenuItem[3];
		String[] editItem = {"색 선택","폰트","텍스트 변경"};
		JMenu editMenu = new JMenu("편집"); //큰 제목
		
		EditActionListener listener2 = new EditActionListener();
		for(int i=0;i<menuItem2.length;i++) { //3개의 메뉴 아이템을 파일에 삽입한다.
			menuItem2[i] = new JMenuItem(editItem[i]);
			menuItem2[i].addActionListener(listener2);
			editMenu.add(menuItem2[i]);
		}
		
		
		//도움말 메뉴
		JMenu helpMenu = new JMenu("도움말"); //큰 제목
		JMenuItem info = new JMenuItem("버전 정보"); 
		info.addActionListener(new ActionListener(){ //showMessageDialog(버전정보를 눌렀을 때)
			@Override
			public void actionPerformed(ActionEvent e) {
				if (e.getActionCommand() == "버전 정보") { //버전정보를 눌렀을 때
					JOptionPane.showMessageDialog(null, "테스트 v1.0"); //해당 내용이 보여진다.
				}
			}
		});
		helpMenu.add(info);   //메뉴 아이템info를 도움말에 삽입
		
		//툴팁 (텍스트필드) , 해당 내용이 뜨도록
		text.setToolTipText("편집에 따라 변결될 영역입니다.");
		
		//JMenuBar에 추가
		mb.add(fileMenu); mb.add(editMenu); mb.add(helpMenu); 
		setJMenuBar(mb);
		
	}
	
	class FileActionListener implements ActionListener{ //예제 14-9 참고
		JFileChooser chooser = new JFileChooser(); //filechooser 선언
		JFileChooser saver = new JFileChooser(); //filechooser 선언
		
		@Override
		public void actionPerformed(ActionEvent e) {
			String cmd = e.getActionCommand();
			if (cmd == "열기") { //열기를 골랐을 경우
				int open = chooser.showOpenDialog(null); //showOpenDialog로 파일 열기 
				String filePath = chooser.getSelectedFile().getPath(); //절대 경로 얻기
				text.setText(filePath + "파일이 선택되었습니다."); //텍스트 값을 해당 내용으로 변경
			}
			else if (cmd == "저장") { //저장을 골랐을 경우
				int save = saver.showSaveDialog(null); //showSavwDialog로 파일 저장
				String filePath = saver.getSelectedFile().getPath(); //절대 경로 얻기
				text.setText(filePath + "파일에 저장되었습니다."); //텍스트 값을 해당 내용으로 변경
			}
			else if (cmd == "종료") { // 종료를 눌렀을 경우, 
				int result = JOptionPane.showConfirmDialog(null, "종료하시겠습니까?","Confirm",JOptionPane.YES_NO_OPTION);//showConfirmDialog창이 뜨도록하기
				if (result == JOptionPane.YES_OPTION) //예를 눌렀을 경우
					System.exit(0); //파일 종료 
					
			}		
		}
	}
	
	class EditActionListener implements ActionListener{
		@Override
		public void actionPerformed(ActionEvent e) {
			String cmd = e.getActionCommand();
			if (cmd == "색 선택") { //색선택을 골랐을 경우
				Color selectedColor = JColorChooser.showDialog(null, "Color", Color.YELLOW); //showDialog 를 통해서 색을 선택
				if(selectedColor != null) //선택한 값이 null 값이 아니라면
					text.setForeground(selectedColor); //텍스트의 색을 고른 색으로 설정한다.
			}
			else if (cmd == "폰트") {
				//실습5(선택)
			}
			else if (cmd == "텍스트 변경") { //텍스트 변경을 골랐을 경우
				String result = JOptionPane.showInputDialog("변경할 텍스트를 입력하세요"); //showInputDialog를 띄워서 변경할 내용을 받아낸다.
				if (result != null) { //입력받은 내욜리 null값이 아니라면
					text.setText(result); //텍스트 값 변경
				}
			}
		}
	}
	
	
	public static void main(String[] args) {
		new SwingTest();
	}
}

 

실습2| 그래픽 그리기

import java.awt.*;
import javax.swing.*;
import java.awt.event.*;

public class DrawGraphic extends JFrame{
	Container c;
	int x,y,width,height; //시작좌표, 끝 좌표 
	int num; //모드 변경하는 변수
	Color sel_color = new Color(000); //rgb값 000 == black
	
	public DrawGraphic() {
		setTitle("그래픽 그리기"); 
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //창 닫기
		c = getContentPane();
		createMenu(); //함수 호출 
		c.add(new MyGraphic()); //container에 그리는 MyGraphic panel 추가
		setSize(400,300);
		setVisible(true);
	}
	
	public void createMenu() {
		JToolBar bar = new JToolBar();
		bar.setBackground(Color.LIGHT_GRAY); //툴바 배경색 설정
		
		JLabel label1 = new JLabel("도형");
		JButton b1 = new JButton("     \\     "); //직선그리기
		b1.addActionListener(new MyListener()); //이벤트 추가 --> 버튼 선택했을 때 모드를 정해주는 이벤트
		JButton b2 = new JButton("   □   "); //사각형 그리기
		b2.addActionListener(new MyListener()); //이벤트 추가 --> 버튼 선택했을 때 모드를 정해주는 이벤트
		JButton b3 = new JButton("   ○   "); //원그리기
		b3.addActionListener(new MyListener()); //이벤트 추가 --> 버튼 선택했을 때 모드를 정해주는 이벤트
		JButton b4 = new JButton("   △   "); //polygon(삼각형) 그리기
		b4.addActionListener(new MyListener()); //이벤트 추가 --> 버튼 선택했을 때 모드를 정해주는 이벤트
		JLabel label2 = new JLabel(" 색 선택 ");		
		JButton color = new JButton(new ImageIcon("C:\\Users\\lg\\Desktop\\생활코딩\\자바\\workspace\\Lab13_1\\src\\color.png")); //이미지 넣기
		
		color.addActionListener(new ActionListener(){ //이미지를 선택했을 때 
			@Override
			public void actionPerformed(ActionEvent e) {
				Color selectedColor = JColorChooser.showDialog(null, "색상 선택", Color.YELLOW ); //색 선택하는JColorChoser (예제 14-10)
		         if(selectedColor!= null) //선택한 값이 null값이 아니라면
		            sel_color = selectedColor;	//sel_color를 선택한 값으로 저장
				}
			});
		
		bar.add(label1); bar.add(b1); bar.add(b2); bar.add(b3); bar.add(b4); bar.add(label2); bar.add(color); //툴바에 추가
		c.add(bar,BorderLayout.NORTH);	//툴바 위치지정
	}
	
	class MyListener implements ActionListener{ //버튼을 눌렀을 때 모드를 설정하는 부분
		public void actionPerformed(ActionEvent e) {
			String cmd = e.getActionCommand(); //버튼값 가져오기
			switch(cmd) { //switch문 활용  (예제 14-2) 
			case "     \\     ":  // 직선을 택했을 때
				num = 0; break; 
			case "   □   ":	//네모 선택
				num = 1; break;
			case "   ○   ": //원 선택
				num = 2; break;
			case "   △   ": //세모 선택
				num = 3; break;
			}
		}
	}
	
	class MyGraphic extends JPanel{ 
		
		public MyGraphic() { //좌표 계산
			addMouseListener(new MouseAdapter(){
	            @Override
	            public void mousePressed(MouseEvent e) { //눌렀을 떄
	               x=e.getX(); //마우스를 눌렀을 때의 x좌표값
	               y=e.getY(); //마우스를 눌렀을 때의 y좌표값
	            }

	            @Override
	            public void mouseReleased(MouseEvent e) { // 뗐을 때
	               width=e.getX()-x; //마우스를 뗐을 때의 x좌표의 시작 좌표를 빼면 width값
	               height= e.getY()-y; //마우스를 뗐을 때의 y좌표의 시작 좌표를 빼면 height값
	            }
	         });
	         
	         addMouseMotionListener(new MouseAdapter() {
	            @Override
	            public void mouseDragged(MouseEvent e) { //드래그 했을 때
	               width=e.getX()-x; // 드래그 했을 때 보일 수 있도록 width값 변경
	               height= e.getY()-y; // 드래그 했을 때 보일 수 있도록 height값 변경   
	            }
	         });
		}
		@Override
		protected void paintComponent(Graphics g) { //버튼에 따른 모드 설정
			super.paintComponent(g);
			g.setColor(sel_color); //해당 그림의 색 지정 (위에서 선택한 색== sel_color에 저장)
			if(num==0) { //직선
				g.drawLine(x, y, x+width, y+height); 
		        repaint(); //repaint 호출
		     }
		     if(num==1) { //사각형
		        g.drawRect(x, y, width, height);
		        repaint(); //repaint 호출
		     }
		     if(num==2) { //원
		        g.drawOval(x, y, width, height);
		        repaint(); //repaint 호출
		     }
		     if(num==3) {  //삼각형 , polygon
		        int xs[]= {x,x+width/2,x+width};  //왼쪽 아래 꼭짓점, 가운데 꼭짓점, 오른쪽 아래 꼭짓점
		        int ys[]= {y+height,y,y+height};  //왼쪽 아래 꼭짓점, 가운데 꼭짓점, 오른쪽 아래 꼭짓점
		        g.drawPolygon(xs,ys,3);
		        repaint(); //repaint 호출
		     }	
		}
	}
	
	public static void main(String[] args) {
		new DrawGraphic();
	}
}

'Programming > JAVA' 카테고리의 다른 글

Ch2. 변수와 자료형  (0) 2021.07.06
Ch1. 자바 프로그래밍 시작하기  (0) 2021.07.06
그래픽  (0) 2020.12.30
기본적인 스윙 컴포넌트와 활용  (0) 2020.12.30
자바의 이벤트 처리  (0) 2020.12.30

댓글