도순씨의 코딩일지

명품 JAVA Programming 12장 실습문제 :: 그래픽 1번-4번 본문

𝐏𝐑𝐎𝐆𝐑𝐀𝐌𝐌𝐈𝐍𝐆/𝐉𝐀𝐕𝐀

명품 JAVA Programming 12장 실습문제 :: 그래픽 1번-4번

도순씨 2020. 7. 1. 17:51

명품 자바 프로그래밍 12장 실습문제

 

1. 패널에 paintComponent를 이용하여 이미지를 그린다. FlowLayout 배치 관리자를 가진 패널 바탕 크기에 일치하도록 "back.jpg" 이미지를 출력하고 그 위에 "Hide/Show" 버튼이 보이도록 프로그램을 작성하여라. "Hide/Show" 버튼이 클릭되면 이미지가 보이지 않게 하고 다시 클릭하면 보이게 하라.

 

 

import javax.swing.*;
import javax.swing.Timer;
import javax.swing.event.*;
import javax.swing.filechooser.FileNameExtensionFilter;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

public class HideButton extends JFrame{
	private MyPanel panel = new MyPanel();
	private JButton btn = new JButton("Hide/Show");
	
	private ImageIcon image = new ImageIcon("/Users/user/Desktop/practice/back.jpg");	// 경로는 다르게 설정해야 함
	private Image img = image.getImage();
	
	int cnt = 0;		// 버튼이 몇 번 눌러졌는지 체크하기 위함
	
	public HideButton(){
		setTitle("이미지 그리기 연습");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(panel);
		add(btn);							// "Hide/Show" 버튼을 컨텐츠팬에 추가
		
		// btn이 눌러질때마다 그림의 hide / show 설정 (익명 클래스 사용)
		btn.addMouseListener(new MouseAdapter() {
			public void mouseClicked(MouseEvent e) {
				cnt++;
				if(cnt % 2 == 1) {		// 이미 이미지가 출력되어 있었다면 이미지를 없앰
					img = null;
					repaint();
				}
				else {					// 이미지가 없었다면 이미지를 설정
					img = image.getImage();
					repaint();
				}
			}
		});
		
		setLayout(new FlowLayout());
		setSize(300, 300);
		setVisible(true);
	}
	
	// paintComponent를 이용하여 이미지 그림
	class MyPanel extends JPanel{
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.drawImage(img, 0, 0, getWidth(), getHeight(), this);		// 화면에 꽉 차게 설정
		}
	}
	
	public static void main(String[] args) {
		new HideButton();
	}
}

 

 

2. 주어진 이미지를 배경으로 출력하고 그 위에 반지름이 20픽셀인 원을 그리고, 마우스를 드래깅하면 원을 이동하는 프로그램을 작성하라. 원의 내부는 초록색으로 채운다. 모두 paintComponent로 작성하라.

 

 

import javax.swing.*;
import javax.swing.Timer;
import javax.swing.event.*;
import javax.swing.filechooser.FileNameExtensionFilter;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

public class CircleDraggedEx extends JFrame{
	private MyPanel panel = new MyPanel();
	public CircleDraggedEx(){
		setTitle("이미지 위에 원 드래깅 연습");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(panel);
		setLayout(new FlowLayout());
		setSize(300, 300);
		setVisible(true);
	}
	
	// paintComponent를 이용하여 이미지 그림
	class MyPanel extends JPanel{
		private ImageIcon image = new ImageIcon("/Users/user/Desktop/practice/back.jpg");	// 경로는 다르게 설정해야 함
		private Image img = image.getImage();
		int x = 100, y = 100;
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.drawImage(img, 0, 0, getWidth(), getHeight(), this);		// 화면에 꽉 차게 설정
			g.setColor(Color.green);
			g.fillOval(x, y, 20, 20);								// 초기 위치는 (100, 100)으로 설정
			
			addMouseMotionListener(new MouseMotionAdapter() {
				public void mouseDragged(MouseEvent e) {
					// x와 y의 좌표를 드래그 된 위치로 바꾸고 repaint()
					x = e.getX();
					y = e.getY();
					repaint();
				}
			});
		}
	}
	
	public static void main(String[] args) {
		new CircleDraggedEx();
	}
}

 

3. JLabel 컴포넌트를 이용하여 이미지("apple.jpg")를 출력하고, 이미지 위에 마우스를 드래깅하여 이미지를 이동시키는 프로그램 작성하라.

 

 

import javax.swing.*;
import javax.swing.Timer;
import javax.swing.event.*;
import javax.swing.filechooser.FileNameExtensionFilter;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

public class apple extends JFrame{
	JLabel label = new JLabel();
	ImageIcon icon = new ImageIcon("/Users/user/Desktop/practice/apple.jpg");
	public apple() {
		setTitle("이미지 레이블 드래깅 연습");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		Container c = getContentPane();
		c.setLayout(null);
		
		label.setIcon(icon);
		label.setSize(icon.getIconWidth(), icon.getIconHeight());
		c.add(label);
		
		c.addMouseMotionListener(new MouseAdapter(){
			public void mouseDragged(MouseEvent e) {
				Component c = (Component)e.getSource();
				c.setLocation(e.getX(), e.getY());
			}
		});
		
		setVisible(true);
		setSize(500, 500);
	}
	public static void main(String[] args) {
		new apple();
	}
}

 

4. 앞의 3번 문제를 수정하여 JLabel을 이용하지 않고, 컨텐트팬에 그래픽으로 이미지를 출력하도록 하라. 그리고 3번 문제와 동일하게 이미지 영역 위에 마우스를 누르고 드래깅하여 이미지를 이동시켜보라.

 

 

import javax.swing.*;
import javax.swing.Timer;
import javax.swing.event.*;
import javax.swing.filechooser.FileNameExtensionFilter;

import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.*;

public class apple extends JFrame{
	private MyPanel panel = new MyPanel(); 
	public apple() {
		setTitle("이미지 레이블 드래깅 연습");
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setContentPane(panel);		// panel을 CONTENTPANE으로 설정
		setVisible(true);
		setSize(500, 500);
	}
	
	class MyPanel extends JPanel{
		private ImageIcon image = new ImageIcon("/Users/user/Desktop/practice/apple.jpg");
		private Image img = image.getImage();
		int x = 0 , y = 0;
		public void paintComponent(Graphics g) {
			super.paintComponent(g);
			g.drawImage(img, x, y, getWidth()/4, getHeight()/4, this);	// 이미지의 크기에 따라서 가변적으로 설정
			addMouseMotionListener(new MouseMotionAdapter() {	// 마우스 어댑터를 익명 클래스를 활용하여 구현
				public void mouseDragged(MouseEvent e) {
					x = e.getX();
					y = e.getY();
					repaint();					// 현재 마우스의 좌표를 받아온 후 repaint()
				}
			});
		}
	}
	public static void main(String[] args) {
		new apple();
	}
}

 

출처

황기태, 김효수,. 명품 JAVA Programming(2018).

 

 

 

Comments