도순씨의 코딩일지
명품 JAVA Programming 12장 실습문제 :: 그래픽 1번-4번 본문
명품 자바 프로그래밍 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).
'𝐏𝐑𝐎𝐆𝐑𝐀𝐌𝐌𝐈𝐍𝐆 > 𝐉𝐀𝐕𝐀' 카테고리의 다른 글
자바 :: 스레드에 관하여 (볼링 예제) (0) | 2020.07.13 |
---|---|
자바 :: GridLayout, eval을 이용하여 계산기 구현하기 (0) | 2020.07.06 |
Comments