명품자바프로그래밍 chapter12_lab11
실습1| color, font 활용
import java.awt.*;
import javax.swing.*;
public class ColorFontTest extends JFrame{
public ColorFontTest() {
setTitle("Color, Font 사용 예제"); //타이틀
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //창 닫기
setContentPane(new MyPanel()); //기본 도화지 세팅
setSize(800,250); // 크기
setVisible(true); //내용이 보이도록
}
class MyPanel extends JPanel{
@Override
protected void paintComponent(Graphics g) { //그림 그리기 메소드, 오버라이디
super.paintComponent(g); //무조건 첫줄에 위치
g.setColor(Color.blue); //글씨 색 설정
g.setFont(new Font("궁서", Font.BOLD,20)); //글씨 폰트 설정
g.drawString("국적: 대한민국(궁서 폰트)", 50, 50); //글의 내용 및 위치 설정
g.setColor(Color.red);
g.setFont(new Font("휴먼고딕", Font.BOLD,30));
g.drawString("주소: 서울시 마포구(휴먼고딕 폰트)", 50, 100);
g.setColor(Color.orange);
g.setFont(new Font("나눔손글씨 펜", Font.BOLD,40));
g.drawString("성명: 안현주(나눔손글씨 펜 폰트)", 50, 150);
g.setColor(Color.gray);
g.setFont(new Font("HY나무B", Font.BOLD,10));
g.drawString("학번: 1911169(HY나무B 폰트)", 50, 200);
}
}
public static void main(String[] args) {
new ColorFontTest();
}
}
실습2| 도형 그리기 및 칠하기
import java.awt.*;
import javax.swing.*;
public class DrawFillTest extends JFrame{
public DrawFillTest() {
setTitle("Draw Fill 사용 예제"); //타이틀
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //창 닫기
Container c = getContentPane(); //컨테이너 생성
c.setLayout(new GridLayout(0,3)); //GridLayout으로 오른쪽으로 가도록
c.add(new MyPanel1()); //3개의 Panel을 만들어서 각각 만들기
c.add(new MyPanel2());
c.add(new MyPanel3());
setSize(1000,370); //크기
setVisible(true); //내용 보이도록 하기
}
class MyPanel1 extends JPanel{ //막대 그래프 (fillRect)
@Override
protected void paintComponent(Graphics g) { //그리기 메소드
super.paintComponent(g);
g.drawRoundRect(10,10,300,300,30,30); // round직사각형 각각 그리기
g.setColor(Color.red);
g.fillRect(50, 50, 40, 250); //각 그림의 위치를 계산해서 해당 색 별로 fillRect
g.setColor(Color.blue);
g.fillRect(110, 110, 40, 190);
g.setColor(Color.orange);
g.fillRect(170, 160, 40, 140);
g.setColor(Color.green);
g.fillRect(230, 110, 40, 190);
}
}
class MyPanel2 extends JPanel{ //파이차트(fillArc)
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawRoundRect(10,10,300,300,30,30); // round직사각형 각각 그리기
g.setColor(Color.green);
g.fillArc(50, 50, 230, 230, 330, 110); //330~360 , 0 ~ 80 각도로 따졌을 때
g.setColor(Color.red);
g.fillArc(50, 50, 230, 230, 80, 120); //80~ 200
g.setColor(Color.blue);
g.fillArc(50, 50, 230, 230, 200, 30); //200~ 230
g.setColor(Color.yellow);
g.fillArc(50, 50, 230, 230, 230, 110); //230 ~ 330
}
}
class MyPanel3 extends JPanel{ //FillPolygon
@Override
protected void paintComponent(Graphics g) { // round직사각형 각각 그리기
super.paintComponent(g);
g.drawRoundRect(10,10,300,300,30,30);
int x[] = {160,190,270,210,230,160,90,110,50,130}; //각 점의 위치를 계산해서 그리기
int y[] = {40,110,120,180,270,230,270,180,120,110};
g.setColor(Color.magenta);
g.fillPolygon(x,y,x.length);
}
}
public static void main(String[] args) {
new DrawFillTest();
}
}
실습3| 이미지 그리기
import java.awt.*;
import javax.swing.*;
public class ImageTest extends JFrame{
public ImageTest() {
setTitle("그래픽 이미지 연습"); //타이틀
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //창 닫기
setContentPane(new MyPanel()); //도화지
setSize(300,300); //크기
setVisible(true); //보이도록 하기
}
class MyPanel extends JPanel{
private ImageIcon icon = new ImageIcon("C:\\Users\\lg\\Desktop\\생활코딩\\자바\\workspace\\Lab12_1\\src\\seoul.jpg"); //그림의 절대경로
private Image img = icon.getImage(); //이미지 객체
@Override
protected void paintComponent(Graphics g) { //이미지 일부분 크기조절 예제12-7
super.paintComponent(g);
int x = this.getWidth(); //창의 가로 길이, 창을 임의로 늘렸을 때도 창의 길이를 계산해야하므로 사용
int y = this.getHeight(); //창의 세로 길이
int weight = img.getWidth(this); //그림의 가로길이
int height = img.getHeight(this); //그림의 세로길이
//이미지를 각 4등분해야하고, 상하좌우 10픽셀씩 떨어져서 그려야하므로(각각 5픽셀씩 나누어 계산), 좌표를 각각 계산한다.
g.drawImage(img, 0, 0, x/2 - 5, y/2 -5, 0, 0, weight/2, height/2, this); //(0,0) 부터 (창의 절반에 -5,창의 절반의-5) 까지 그릴껀데, 이미지는 해당 맞는 위치의 이미지의 1/4만큼 가져온다.
g.drawImage(img, x/2 +5, 0, x, y/2 -5, weight/2, 0, weight, height/2, this); //(창의 절반의 +5,0) 부터 (창의 가로 끝,창의 절반-5) 까지 그릴껀데, 이미지는 해당 맞는 위치의 이미지의 1/4만큼 가져온다.
g.drawImage(img, 0, y/2 +5, x/2 -5, y, 0, height/2, weight/2, height, this); //(0,창의 절반+5) 부터 (창의 절반의-5,창의 세로끝) 까지 그릴껀데, 이미지는 해당 맞는 위치의 이미지의 1/4만큼 가져온다.
g.drawImage(img, x/2 +5, y/2 +5, x, y, weight/2, height/2, weight, height, this); //(창의 절반 +5,창의절반+5) 부터 (창의 가로끝,창의 세로끝) 까지 그릴껀데, 이미지는 해당 맞는 위치의 이미지의 1/4만큼 가져온다.
}
}
public static void main(String[] args) {
new ImageTest();
}
}
실습4| 신호등 예제
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class TrafficTest extends JFrame{
JButton btn;
int mode=0;
public TrafficTest() {
setTitle("Traffic Test"); //타이틀
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //창닫기
Container c = getContentPane();
c.add(new MyPanel(),BorderLayout.CENTER); //center에 위치하는 Mypanel
btn = new JButton("traffic light turn on"); //버튼
btn.addActionListener(new MyListener()); //이벤트에 추가
c.add(btn,BorderLayout.SOUTH); //south에 위치
setSize(300,500); //크기
setVisible(true); //화면에 보이도록 하기
}
class MyPanel extends JPanel{ //모드값에 따라 repaint mode값 변경... 0(빨),1(초),2(노) 이런식으로
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawOval(80, 80, 100, 100); //검정색 테두리가 있어서 그려주기, default색 은 검정이라 따로 지정해주지 않는다.
g.drawOval(80, 180, 100, 100);
g.drawOval(80, 280, 100, 100);
if (mode == 0) { //mode가 0일때 빨간색 색칠
g.setColor(Color.red);
g.fillOval(80, 80, 100, 100);
}
else if (mode== 1) { //mode가 1일때 초록색 색칠
g.setColor(Color.green);
g.fillOval(80, 180, 100, 100);
}
else { //mode가 2일때 노란색 색칠
g.setColor(Color.yellow);
g.fillOval(80, 280, 100, 100);
}
}
}
private class MyListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
JButton b = (JButton)e.getSource();
if(b.getText().equals("traffic light turn on")) { // 해당 버튼을 눌렀을 때
mode++; //mode++ 해야지 기본 빨강에서 다른 색으로 바꿀수 있음
if(mode>2) //mode가 3이되면 0으로 바꿔주기
mode =0;
repaint(); //repaint()해줘야 적용됨
}
}
}
public static void main(String[] args) {
new TrafficTest();
}
}
실습5| 파이차트만들기
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
public class PieChartFrame extends JFrame{
JTextField tf[] = new JTextField[4]; //4개의 텍스트필드를 받아야함.
String fruits[] = {"apple","cherry","strawberry","prune"}; //4개의 과일
Color c[] = {Color.red,Color.blue,Color.magenta,Color.orange}; //4개의 색
int angles[] = new int[4]; //각각 의 과일에 해당하는 angel값 저장하는 배열
public PieChartFrame() {
setTitle("파이 차트 그리기"); //타이틀
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //창 닫기
Container c = getContentPane();
c.add(new MyPanel1(), BorderLayout.NORTH); //텍스트 필드가 위치하는 패널은 north
c.add(new MyPanel2(), BorderLayout.CENTER); //그림을 그리는 패널은 center
setSize(800,600); //창 크기
setVisible(true); //내용물이 보이도록
}
class MyPanel1 extends JPanel{
public MyPanel1() {
setBackground(Color.gray); //뒷배경 색은 회색
for(int i=0; i<fruits.length;i++) {
tf[i] = new JTextField(10); //TextField 생성
tf[i].addActionListener(new MyListener()); //textfield 4개를 다 입력 받았을 때 해당 값을 계산하는 이번트 추가
add(new JLabel(fruits[i])); //해당 인덱스의 fruits 명을 먼저 추가하고
add(tf[i]); //해당 인덱스의 tf를 각각 추가한다.
}
}
}
class MyPanel2 extends JPanel{
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
int angle =0; //시작 부분 0
for(int i=0;i<fruits.length;i++) {
g.setColor(c[i]); //색 지정
g.drawString(fruits[i] + " " + (int)Math.ceil(angles[i]*100/360)+"%", 100+180*i, 50); //텍스트 필드를 출력
// 과일 이름 + 해당 angles를 백분율로 환산하여 올림한 값, x좌표, y좌표 --> x좌표는 오른쪽으로 이동해야하므로 MyPanel1의 텍스트 필드 아래에 위치하도록 변경
}
for(int i=0;i<fruits.length;i++) {
g.setColor(c[i]); //색 지정
g.fillArc(200, 100, 400, 400, angle, angles[i]); //해당 위치 x,y,width,height ,시작값, 칠할 정도.? / 360도에 환산하여 저장한 angles 만큼 칠한다.
angle += angles[i]; //시작값은 칠한 값을 더하여, 수정되도록한다.
}
}
}
private class MyListener implements ActionListener{
double n[] = new double[4]; //입력 받은 값을 저장할 배열
@Override
public void actionPerformed(ActionEvent e) { //textfield로 받은 값 정수화하기
double sum =0;
for(int i=0;i<fruits.length;i++) {
n[i] = Integer.parseInt(tf[i].getText()); //해당 필드에서 입력받은 내용을 n 배열에 저장
sum += n[i]; //sum 에 해당 내용을 누적합한다.
}
for(int i=0;i<fruits.length;i++) { //앵글값구하기
angles[i] = (int)Math.ceil((n[i]/sum*360)); //angle배열에 해당 입력받은 값을 360도를 기준으로 환산하여 구한다. ceil은 올림 함수.
}
repaint(); //repaint해야지 적용됨
}
}
public static void main(String[] args) {
new PieChartFrame();
}
}
'Programming > JAVA' 카테고리의 다른 글
Ch1. 자바 프로그래밍 시작하기 (0) | 2021.07.06 |
---|---|
스레드와 멀티태스킹, 고급 스윙 컴포넌트 (0) | 2020.12.30 |
기본적인 스윙 컴포넌트와 활용 (0) | 2020.12.30 |
자바의 이벤트 처리 (0) | 2020.12.30 |
자바 GUI 기초, AWT와 스윙 (0) | 2020.12.30 |
댓글