이번 시간에는 자바 스윙으로 간단한 그림판을 만들어 보는 시간을
가지겠습니다.
그림판을 만들기 위해서 소스 코드가 그렇게 긴건 아니지만
클래스 파일(.java)가 3개 정도 필요하더군요.
먼저 결과 화면부터 보겠습니다.
기본적으로 빨, 초, 파 선 색상을 그릴 수 있게끔 해두었고
경우에 따라..
선을 굵게, 얇게 할 수 있으며
선택적으로 지우거나, 전부 지우게 할 수 있습니다.
또한 색상표를 이용하여 다른 색상의 선을 그릴 수가 있습니다.
자 그럼 어떻게 구현됬는지 소스 코드를 볼까요~!
== MyDrawing.java (메인 컴포넌트가 있는 메인함수 - 실제 마우스 이벤트와 버튼 이베트가 처리 된 곳임 ==
public class MyDrawing extends JFrame {
JPanel p1,p2;
JButton btR, btG, btB, btOpen;
Canvas can; // 부모타입
PaintToolFrame pt;
public MyDrawing(){
super("::MyDrawing::");
pt=new PaintToolFrame();
p1=new JPanel(); add(p1, "North");
p2=new JPanel(){ // 여백주기
public Insets getInsets(){
return new Insets(40,10,10,10);
}
}; add(p2, "Center");
p2.setBackground(Color.lightGray);
btR=new JButton(new ImageIcon("./images/red.png")); p1.add(btR);
btG=new JButton(new ImageIcon("./images/green.png")); p1.add(btG);
btB=new JButton(new ImageIcon("./images/blue.png")); p1.add(btB);
btOpen=new JButton("Paint Tool"); p1.add(btOpen);
can=new MyCanvas(); // 도화지 역할을 하는 컴포넌트 MyCanvas는 can을 상속 받는 자식->원이 갑자기 생김
can.setSize(300, 300); // 도화지 크기
can.setBackground(Color.white); // 도화지 배경색 주기
p2.add(can);
//리스너 부착 -------------------
MyHandler my=new MyHandler();
can.addMouseMotionListener(my); // 캔버스 객체에 마우스모션리스너를 부착한다.
btR.addActionListener(my);
btG.addActionListener(my);
btB.addActionListener(my);
btOpen.addActionListener(my);
//pt버튼(PaintToolFrame 클래스꺼)에도 리스너를 부착하자
pt.btPlus.addActionListener(my);
pt.btMinus.addActionListener(my);
pt.btClear.addActionListener(my);
pt.btAllClear.addActionListener(my);
pt.btColor.addActionListener(my);
pt.btClose.addActionListener(my);
//이번에는 메인에서 안하고 생성자에서 한다
setSize(500,500);
setVisible(true);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
/*이벤트소스: 캔버스
* 이벤트: MouseEvent
* 이벤트 핸들러: MouseMotionListener를 구현
* */
class MyHandler implements MouseMotionListener, ActionListener{
public void mouseDragged(MouseEvent e){
setTitle("Drag");
//마우스를 드래그한 지점의 x좌표,y좌표를 얻어와서 can의 x,y 좌표값에 전달한다.
int xx=e.getX(); int yy=e.getY();
setTitle("xx="+xx+", yy"+yy);
((MyCanvas)can).x=xx; ((MyCanvas)can).y=yy;
//paint()는 JVM이 호출해주는 메소드으로 변경x, repaint을 써서 재사용하자
can.repaint();
}
public void mouseMoved(MouseEvent e){
}
public void actionPerformed(ActionEvent e){
Object o=e.getSource();
MyCanvas can2 = (MyCanvas)can;
if(o==btR){
can2.cr=Color.red;
}else if(o==btG){
can2.cr=Color.GREEN;
}else if(o==btB){
can2.cr=Color.blue;
}else if(o==btOpen){
// 새로운 'paintToolJframe' 생성해서 창 열기
//PaintToolFrame pt = new PaintToolFrame(); 여기서 코드 넣으면 매번 프레임 생성 ㅜ
//pt.setSize(400, 400);
pt.pack(); // 크기를 압축해서 보여줌
pt.setLocation(getWidth(),0); //x축만큼 오른쪽으로 창 이동
pt.setVisible(true);
}else if(o==pt.btPlus){
can2.w +=10; can2.h+=10;
}else if(o==pt.btMinus){
if(can2.w>3){ // 버튼을 계속 누르면 아예 안나옴. 최소한의 크기 설정
can2.w -= 10; can2.h -= 10;
}
}else if(o==pt.btClear)
// 드래그한 지점만 부분 지우기
can2.cr=can.getBackground();
}else if(o==pt.btAllClear){
// 캔버스를 모두 지우기
// Graphics 클래스의 clearRect(x,y,w,h)
Graphics g=can2.getGraphics();
g.clearRect(0, 0, can.getWidth(), can.getHeight());
}else if(o==pt.btColor){
// (Swing에 있음) JColorChooser를 띄워서 선택한 색상으로 그려지도록
Color selCr = JColorChooser.showDialog(null, "색선정", Color.blue); // null=스크린 중앙에 화면 나옴
can2.cr=selCr;
}else if(o==pt.btClose){
// pt만 닫혀지도록
//pt.setVisible(false);-> 눈에 보이지 않는것일뿐임
pt.dispose(); // 시스템 자원을 반납해줌
}
}
}
public static void main(String[] args) {
new MyDrawing(); // 생성자 불러오기
}
}
== MyCanvas.java 그림을 그릴수 있는 나만의 도화지 클래스 ======
public class MyCanvas extends Canvas {
//처음에 까만색 점 안찍히게 하기 위해서 x,y -값 지정
int x=-50; int y=-50; w=7; h=7;
Color cr=Color.black;
@Override
public void paint(Graphics g){
g.setColor(cr);
g.fillOval(x, y, w, h); // x, y 지점에 70,70 크기의 원 그리기
}
@Override
public void update(Graphics g){
paint(g);
}
}
== PaintToolFrame.java 메인 창에서 PaintTool 버튼을 누를 때 나오는 창 화면 ===========
public class PaintToolFrame extends JFrame{
JButton btPlus, btMinus, btClear, btAllClear, btClose, btColor;
JPanel p;
public PaintToolFrame(){
super("::PaintToolFrame::");
Container c=getContentPane();
p=new JPanel();
c.add(p, "Center");
p.add(btPlus=new JButton("크게"));
p.add(btMinus=new JButton("작게"));
p.add(btClear=new JButton("지우기"));
p.add(btAllClear=new JButton("모두지우기"));
p.add(btColor=new JButton("색상"));
p.add(btClose=new JButton("닫기"));
}
}
댓글 없음:
댓글 쓰기