본문 바로가기
Programming Study/절대JAVA

[절대JAVA]10장 프로그래밍 연습문제(1)

by 푸고배 2018. 10. 1.

1. 다음 조건을 만족하며 클래스 JFrame을 상속받는 클래스를 구현하여 테스트하는 프로그램을 작성하시오.

- 윈도우의 하단에 색상을 표현하는 버튼 2개 추가

- 버튼을 누르면 윈도우 바탕을 선택한 버튼의 색상으로 수정

- 윈도우의 캡션 제목은 "버튼 액션 이벤트 처리"

<소스코드> Chapter10_1.java

package Chapter10_1;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Chapter10_1 extends JFrame implements ActionListener{
	JButton yellowBtn;
	JButton redBtn;
	JPanel p1; // 색이 바뀌는Panel
	JPanel p2; // 버튼이 들어가는 Panel
	//생성자
	public Chapter10_1(String title) {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(300, 200);
		setTitle(title);
		
		ButtonAction();
		setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Chapter10_1 c = new Chapter10_1("버튼 액션 이벤트 처리");
	}

	void ButtonAction() {
		yellowBtn = new JButton("노랑");
		redBtn = new JButton("빨강");
		p1 = new JPanel();
		p2 = new JPanel();
		
		p2.setLayout(new GridLayout(0, 2));
		p2.add(yellowBtn);
		p2.add(redBtn);
		add(p1, BorderLayout.CENTER);
		add(p2, BorderLayout.SOUTH);
		
		yellowBtn.addActionListener(this);
		redBtn.addActionListener(this);
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		String btnStr = e.getActionCommand();
		if(btnStr.equals("노랑")) {
			p1.setBackground(Color.YELLOW);
		}else {
			p1.setBackground(Color.RED);
		}
	}

}

 

2. 다음 조건을 만족하며 클래스 JFrame을 상속받는 클래스를 구현하여 테스트하는 프로그램을 작성하시오.

- 버튼을 다음과 같이 5개로 구성

- 색상을 지정하면 윈도우 제목에 색상이 표시

- [pentagon] 버튼을 누르면 지정한 색상으로 오각형을 그리기

 

<소스코드> Chapter10_2.java

package Chapter10_2;

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Panel;
import java.awt.Polygon;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;

public class Chapter10_2 extends JFrame implements ActionListener{
	Panel btnPanel; // 버튼 들어가는 Panel
	int x[] = {130,180,230,205,155};
	int y[] = {180,140,180,230,230};
	Button pentagonBtn;
	Button redBtn;
	Button yellowBtn;
	Button blueBtn;
	Button blackBtn;
	Color color;
	
	// 생성자
	public Chapter10_2(String title) {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(500,300);
		setVisible(true);
		drawPentagon();
	}
	public void drawPentagon() {
		btnPanel = new Panel();
		pentagonBtn = new Button("pentagon");
		redBtn = new Button("red");
		yellowBtn = new Button("yellow");
		blueBtn = new Button("blue");
		blackBtn = new Button("black");
		color = Color.black;
				
		btnPanel.setLayout(new FlowLayout());
		btnPanel.add(pentagonBtn);
		btnPanel.add(redBtn);
		btnPanel.add(yellowBtn);
		btnPanel.add(blueBtn);
		btnPanel.add(blackBtn);
		
		add(btnPanel,BorderLayout.NORTH);
		
		// 버튼에 액션 리스너 추가
		pentagonBtn.addActionListener(this);
		redBtn.addActionListener(this);
		yellowBtn.addActionListener(this);
		blueBtn.addActionListener(this);
		blackBtn.addActionListener(this);
	}
	public void paint(Graphics g) {
		g.setColor(color);
		g.fillPolygon(new Polygon(x, y,5));
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Chapter10_2 c = new Chapter10_2("Chapter10_2");
	}
	@Override
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		String strBtn = e.getActionCommand();
		if(strBtn.equals("pentagon")) {
			repaint();
		} else {
			setTitle(strBtn); // 색상을 지정하면 윈도우 제목에 색상 표시
			switch (strBtn) {
			case "red":
				color = Color.red;
				break;
			case "yellow":
				color = Color.yellow;
				break;
			case "blue":
				color = Color.blue;
				break;
			case "black":
				color = Color.black;
				break;
			default:
				break;
			}
		}
	}

}

 

3. 마우스 이벤트를 처리하여 다음 조건을 만족하는 윈도우를 구현하여 테스트하는 프로그램을 작성하시오.

- 마우스를 누른 지점에서 드래그 후 놓은 지점까지 직선을 그리기

- 현재의 윈도우에서는 이전에 그린 직선도 계속 보이도록 구현

- 윈도우 내부에서 MouseAdapter를 상속받는 클래스를 구현하여 이벤트 처리

<소스코드> Chapter10_3.java

package Chapter10_3;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JFrame;


public class Chapter10_3 extends JFrame {
	Point p1 = new Point(0,0); // 시작점
	Point p2 = new Point(0,0);; // 끝점
	
	public Chapter10_3(String title) {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(500, 200);
		setTitle(title);
		addMouseListener(new Mouse()); // 모션리스너 등록
		setVisible(true);
	}
	@Override
	public void paint(Graphics g) {
		g.setColor(Color.magenta);
		g.drawLine(p1.x, p1.y, p2.x, p2.y);
	}
	@Override
	public void update(Graphics g) {
		paint(g);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Chapter10_3 c = new Chapter10_3("마우스를 누르고 이동한 후 놓아 보세요.");
	}
	class Point{ // int값 x, y를 가지는 클래스 
		int x;
		int y ;
		Point(int x, int y){
			this.x = x;
			this.y = y;
		}
		
	}
	class Mouse extends MouseAdapter{
		public void mousePressed(MouseEvent e) { // 드래그 시작
			p1 = new Point(e.getX(),e.getY()); // 시작 점 저장
		}
		public void mouseReleased(MouseEvent e) { // 드래그 끝
			p2 = new Point(e.getX(),e.getY()); // 끝 점 저장
			repaint();
		}
	}
}

 

4. 마우스 이벤트를 처리하여 다음 조건을 만족하는 윈도우를 구현하여 테스트하는 프로그램을 작성하시오.

- 처음 실행 화면

- 마우스를 누르면 윈도우 제목에 시작점 : (x좌표, y좌표)가 표시

- 마우스를 드래그하면 계속 중간점 : (x좌표, y좌표)이 표시되면서 직선이 그려짐

- 마우스를 놓으면 끝점 : (x좌표, y좌표)이 표시되면서 직선이 그려짐

- 마우스를 누르면 이전 직선은 없어지고 새로운 직선이 그려지도록 구현

 

<소스코드> Chapter10_4.java

package Chapter10_4;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import javax.swing.JFrame;
import javax.swing.event.MouseInputListener;


public class Chapter10_4 extends JFrame implements MouseInputListener{
	private static final long serialVersionUID = 1L;
	Point p1 = new Point(0,0); // 시작점
	Point p2 = new Point(0,0);; // 끝점
	public Chapter10_4(String title) {
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setSize(500, 200);
		setTitle(title);
		addMouseMotionListener(this); // 모션리스너 등록
		addMouseListener(this);
		setVisible(true);
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Chapter10_4 c = new Chapter10_4("마우스를 누르고 이동한 후 놓아 보세요.");
	}
	class Point{ // int값 x, y를 가지는 클래스 
		int x;
		int y ;
		Point(int x, int y){
			this.x = x;
			this.y = y;
		}
		
	}
	@Override
	public void paint(Graphics g) { 
		super.paint(g);
		g.setColor(Color.magenta);
		g.drawLine(p1.x, p1.y, p2.x, p2.y);
	}
	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub

	}
	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mousePressed(MouseEvent e) {
		// TODO Auto-generated method stub
		getGraphics().clearRect(0, 0, 500, 200); // 화면 초기화
		p1 = new Point(e.getX(),e.getY()); // 시작 점 저장
		setTitle("시작점 : ("+e.getX()+", "+e.getY()+")");
	}
	@Override
	public void mouseReleased(MouseEvent e) {
		// TODO Auto-generated method stub
		setTitle("끝점 : ("+e.getX()+", "+e.getY()+")");
	}
	@Override
	public void mouseDragged(MouseEvent e) {
		// TODO Auto-generated method stub
		setTitle("중간점 : ("+e.getX()+", "+e.getY()+")");
		p2 = new Point(e.getX(),e.getY()); // 중간 점 저장
		repaint();
	}
	@Override
	public void mouseMoved(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
}

 

참고자료 : 인피니티북스 절대 JAVA

github 주소 : 

https://github.com/ch1517/Network-programming/tree/master/Chapter10

반응형

댓글