카테고리 없음

ActionEvent를 이용하여 순환하는 색상 패널들 만들기

오늘의 진 2022. 8. 5. 15:03

(개요)

색상 버튼을 만들고 색상 버튼을 누르면 아래와 같이 출력되도록 프로그램 만들기

이전 위치의 색상 현재색상 다음 위치의 색상
package Test;

import java.awt.Button;
import java.awt.Color;
import java.awt.Frame;
import java.awt.GridLayout;
import java.awt.Panel;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

//색상패드 만들기 - 핸들러 방식 
public class ColTest_1 extends Frame {

	Panel btp, slide, p1, p2, p3;
	Button[] bt = new Button[8];

	Color[] color = { Color.red, Color.orange, Color.yellow, Color.green, Color.magenta, Color.cyan, Color.gray,
			new Color(215, 188, 242) };
	String[] str = { "Red", "Orange", "Yellow", "Green", "Magenta", "Cyan", "Gray", "Puple", };

	public ColTest_1() {
		super("색상 테스트");

		btp = new Panel();
		slide = new Panel();
		p1 = new Panel();
		p2 = new Panel();
		p3 = new Panel();

		// 버튼 상세조정
		for (int i = 0; i < bt.length; i++) {

			bt[i] = new Button(str[i]);
			bt[i].setForeground(color[i]);

			btp.add(bt[i]);

			// 이벤트 달기
			bt[i].addActionListener(new Handeler());

		}

		// 패널들의 위치 조정
		slide.setLayout(new GridLayout(1, 3));
		slide.add(p1);
		slide.add(p2);
		slide.add(p3);
		add("North", btp);
		add("Center", slide);

		setSize(300, 300);
		setVisible(true);

	}

	public static void main(String[] args) {
		new ColTest_1();
	}

	// 이벤트 처리를 위한 구문 작성

	class Handeler implements ActionListener {

		@Override
		public void actionPerformed(ActionEvent e) {

			Button obj = (Button) e.getSource();

			for (int i = 0; i < bt.length; i++) {

				if (obj == bt[i]) {
					p1.setBackground(color[(i + 7) % 8]);// 앞
					p2.setBackground(color[i]); // 현재
					p3.setBackground(color[(i + 1) % 8]); // 뒤
				}

			}

		}

	}

}

 

 

 

 

 

 

 

 

 

 

(설명)

버튼을 붙일 패널 1개 , 색상패널3개, 색상패널들을 담을 행렬형태의 패널 1개 생성 

 

색깔을 돌리는 방법 : 색상이 총 8개이므로 현재 색이 나올 공간에는 color[i]를 준다. 

그 다음 색이 나올 공간은 i+1번째 색이 나올 공간인데 색상이 총 8개이므로 i=8 이되면 오류가 발생 

이를 8로 나눈 나머지를 구하면 1이다. 첫번째로 돌아감 이를 이용한다. 

8개가 반복되는 순환 구조임을 이용하여 8로 나눈 나머지를 이용한다.

(순환소수에서 i번째 수를 구하는 것과 같은맥락)

12345678  /   12345678   / 12345678  반복

마찬가지로 i번째 수 이전에 나올 것은 i-2가 아니라 i+7의 8로 나눈 나머지를 구해준다.