- [Java 기본] Graphics

Posted by 겨울에
2011. 5. 14. 16:18 scrap/ Java/JSP
출처 : http://cafe.naver.com/litave/387

 

//===========================================================================//
  본 내용은 2002년 제가 Java 강의를 수강하며 정리 했던 내용을
    기본으로 하여 정리하였습니다.
  - 마침 java 기초를 전파할 기회가 생겨 핑계김에 정리해 가려 합니다.
  작성자 : litwave
//---------------------------------------------------------------------------//

<목차>

1. Graphics
  생성자, Methodpaint 실행 시기


//---------------------------------------------------------------------------//

*Graphics
  - java.awt.*;          //에 포함된 클래스 이다.

1. 생성자() -update(Graphics g) -paint(Graphics g)
  - paint 는 setVisible 실행 시 화면이 뜨면서 처음으로 실행되는 부분
class A extands Frame {
  public void update(Graphics g) {        // 이부분은 Frame에 정의 되어 있다.
                                          // 일반적으로 제정의 하지 않는다.

    paint(g);    //디폴트로 <- 를 실행한다.
  }
  public void paint(Graphics g) {       //이부분도 Frame에 포함된 메소드 이므로 제정의 해서 사용할 수 있다.

  }
}

A ap = new A();          // ap에서 A라는 객체의 메소드를 호출하면..
                         // public void update(Graphics g) {  }       이 자동으로 호출 된다.
                         //   -> 여기에는 현재의 프레임을 Default로 설정 하라고 되어 있다.

2. Method     // Graphics에서 자주 사용하는 메소드(paint { } 에서 사용할 수 있는 것들.)
  1draw
    adrawLine(xy, x1, y1);           //전부 pixel의 값이다.
    bdraw(fill)Rect(xy, w, h);       //draw속성과 fill속성을 둘다 가지고 있다.      //사각형을 그리겠다.
    c) draw(fill)Oval(xy, w, h);       //draw는 선을 그리고 fill은 -> 사용하면 안에 색이 칠해 진다.  //원을 그리겠다.
      - 여기서 그리는 원은 사각형에 내접하는 원이 그려 진다.
    d) draw(fill)RoundRect(xy, w, h, rx, ry);
      - 모서리가 둥근 사각형이 그려진다.
    e) draw(fill)Polygon(x[], y[], 개수);
      - 다각형을 그릴 수 있다.
      - x[], y[]는 꼭지점의 좌표들을 담고 있다.
        -> 꼭지점의 순서대로 배열에 넣어 주면 된다.
  2String             // 글자들은 특정 구역에 상관 없이 적어 줄 수 있다.
    - drawString(string, xy);
    예) drawString("ggg"100100);   //여기서 좌표는.. 글자의 중간 쯤이다..

  3Image
    객체발생 :
      Image im = Toolkit.getDefaultToolkit().getImage("파일");  // 특정 파일로 부터 자바의 프로그램으로 불러 올 수 있다.
                  //Toolkit 객체 생성(외부와의 연동시 절대 경로명을 적어 주어야 한다. 리눅스: / , 윈도우: \\(역슬레시 두개를 사용해 주어야 한다.)

    - drawImage(im, xy, 표시화면)        //특정 시작 점에서 부터 이미지의 크기대로 그려진다.
    - drawImage(im, xy, w, h, 표시화면)

  4) 도형의 색 지정
    - g.setColor(?)를 이용해서 특정 색상을 글자나 도형에 표시 할 수 있다.
    - g.setColor(?)를 도형을 그리기 직전에 지정하면 그림은 그 바로 이전에 지정한 색상으로 그려진다.


3. paint가 실행되는 시기.
  1) 생성자 실행시
  2resize 되는 순간에 update -paint(--) 순으로 수행됨 (아이콘화 하는 것도 포함)
  3repaint() Method를 호출 하는 순간에.. update->paint(--) 실행 된다.

4. 여기서 문제 점은 컴퍼넌트와 결합해서 사용 할때 그래픽과 컴퍼넌트 사이의 충돌이 일어나게 된다.
  -> 이미지를 컴퍼넌트화 시키면 된다.

  Graphics --> Component로 만들기
               ^(Canvas 클래스를 상속 받거나) 혹은 Conponent 혹은 Container 을 상속 받아서 사용해야 한다.
                    ^awp만 됨                        ^ 여기는 전부 됨


//---------------------------------------------------------------------------//
// 수업중 소스
// Ex0123_01.java : Graphics 클래스 내 메소드 실습
//  - aaa.gif는 아무 이미지나 사용하면 됨
import java.awt.*;
import java.awt.event.*;
class Ex0123_01_Sub1 extends Canvas{
    private Image im;
    public Ex0123_01_Sub1() {
        im = Toolkit.getDefaultToolkit().getImage("aaa.gif");
    }
    //public void update(Graphics g){
    //    ........
    //    paint(g);
    //}
    public void paint(Graphics g) {
        g.drawLine(100100150150);
        g.setColor(Color.red);
        g.drawRect(5050100100);
        g.setColor(Color.blue);
        g.drawOval(5050100100);
        g.setColor(Color.green);
        int[] xy;
        g.drawPolygon(x = new int[]{7012050}, y = new int[]{30100120}, 3);
        g.drawImage(im, 15050100100this);
    }
    public Image getIm() {
        return im;
    }
}

class Ex0123_01_Sub extends Frame {
    private Ex0123_01_Sub1 ess = new Ex0123_01_Sub1();
    public Ex0123_01_Sub() {
        super("Test");
        this.init();
        this.start();
        //this.setIconImage(ess.getIm());
        this.setSize(300200);
        this.setVisible(true);
    }
    public void init() {
        this.setLayout(new BorderLayout());
        this.add("North"new Button("확인"));
        this.add("Center", ess);
    }
    public void start() {
    
    }
}
public class Ex0123_01 {
    public static void main(String[] ar) {
        Ex0123_01_Sub es = new Ex0123_01_Sub();
    }
}


//---------------------------------------------------------------------------//
// Ex0123_02.java : Image 확대 축소 실습
//  - aaa.gif는 아무 이미지나 사용하면 됨
import java.awt.*;
import java.awt.event.*;
class Ex0123_02_Sub1 extends Canvas {
    private Image im;
    private int x = 100y = 100;
    public Ex0123_02_Sub1() {
        im = Toolkit.getDefaultToolkit().getImage("aaa.gif");
    }
    public void paint(Graphics g) {
        g.drawImage(im, 5050xythis);
    }
    public void setXY(int xint y) {
        this.x = x;
        this.y = y;
        this.repaint();
    }
}

class Ex0123_02_Sub extends Frame implements ActionListener {
    private Button bt = new Button("확대");
    private Button bt1 = new Button("축소");
    private Ex0123_02_Sub1 ess = new Ex0123_02_Sub1();
    
    public Ex0123_02_Sub() {
        super("Test");
        this.init();
        this.start();
        this.setSize(400400);
        this.setVisible(true);
    }
    public void init() {
        this.setLayout(new BorderLayout());
        Panel p = new Panel(new FlowLayout(FlowLayout.RIGHT));
        p.add(bt);
        p.add(bt1);
        this.add("North", p);
        this.add("Center", ess);
        bt1.setEnabled(false);//취소버튼 사용 못함..
        bt.requestFocus();
    }
    public void start() {
        bt.addActionListener(this);
        bt1.addActionListener(this);
    }
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == bt){//확대..
            bt.setEnabled(false);
            bt1.setEnabled(true);
            bt1.requestFocus();
            ess.setXY(200200);
        } else if(e.getSource() == bt1) {//축소...
            bt1.setEnabled(false);
            bt.setEnabled(true);
            bt.requestFocus();
            ess.setXY(100100);
        }
    }
}
public class Ex0123_02 {
    public static void main(String[] ar) {
        Ex0123_02_Sub es = new Ex0123_02_Sub();
    }
}


//---------------------------------------------------------------------------//
// Ex0123_03.java : 사각형 및 원 그리기 실습
import java.awt.*;
import java.awt.event.*;
class Ex0123_03_Sub1 extends Canvas {
    private int xy, w, h;
    public void setXYWH(int xint yint w, int h) {
        this.x = xthis.y = y;
        this.w = w; this.h = h;
        this.repaint();
    }
    public void paint(Graphics g) {
        g.drawRect(xy, w, h);
        g.drawOval(xy, w, h);
    }
}

class Ex0123_03_Sub extends Frame implements ActionListener {
    private Ex0123_03_Sub1 ess = new Ex0123_03_Sub1();
    private Button bt = new Button("사각형 + 원 그리기");
    private Dialog dlg = new Dialog(this"그리기"true);
    private Label dlglb = new Label("x = "Label.RIGHT);
    private Label dlglb1 = new Label("y = "Label.RIGHT);
    private Label dlglb2 = new Label("w = "Label.RIGHT);
    private Label dlglb3 = new Label("h = "Label.RIGHT);
    private TextField dlgtf = new TextField();
    private TextField dlgtf1 = new TextField();
    private TextField dlgtf2 = new TextField();
    private TextField dlgtf3 = new TextField();
    private Button dlgbt = new Button("그리기");
    private Button dlgbt1 = new Button("취소");
    public Ex0123_03_Sub() {
        super("Test");
        this.init();
        this.start();
        this.setSize(300200);
        this.setVisible(true);
    }
    public void init() {
        this.initDlg();
        this.setLayout(new BorderLayout());
        Panel p = new Panel(new FlowLayout(FlowLayout.RIGHT));
        p.add(bt);
        this.add("South", p);
        this.add("Center", ess);
    }
    public void initDlg() {
        dlg.setLayout(new BorderLayout());
        Panel p = new Panel(new GridLayout(41));
        Panel p1 = new Panel(new GridLayout(41));
        Panel p2 = new Panel(new FlowLayout(FlowLayout.RIGHT));
        p.add(dlglb); p.add(dlglb1);
        p.add(dlglb2); p.add(dlglb3);
        p1.add(dlgtf); p1.add(dlgtf1);
        p1.add(dlgtf2); p1.add(dlgtf3);
        p2.add(dlgbt); p2.add(dlgbt1);
        dlg.add("West", p);
        dlg.add("Center", p1);
        dlg.add("South", p2);
        dlg.setSize(200140);
    }
    public void start() {
        bt.addActionListener(this);
        dlgbt.addActionListener(this);
        dlgbt1.addActionListener(this);
    }
    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == bt) {
            //다이얼 로그...띄우기...
            dlg.setVisible(true);
        } else if(e.getSource() == dlgbt) {
            int x = Integer.parseInt(dlgtf.getText().trim());
            int y = Integer.parseInt(dlgtf1.getText().trim());
            int w = Integer.parseInt(dlgtf2.getText().trim());
            int h = Integer.parseInt(dlgtf3.getText().trim());
            ess.setXYWH(xy, w, h);
            dlg.setVisible(false);
        } else if(e.getSource() == dlgbt1) {
            dlg.setVisible(false);
        }
    }
}
public class Ex0123_03 {
    public static void main(String[] ar) {
        Ex0123_03_Sub es = new Ex0123_03_Sub();
    }
}

//===========================================================================//

>>>>> Graphics - 그림판 예제

 
 

/****************************************

Title : 수업 내용 Canvas로 구성하기
Author : litwave
Date : 2003. 01. 27
****************************************/
import java.awt.*;
import java.awt.event.*;
import java.util.*;

class Ho0127_01_Sub1 {
    private int xy, x1, y1, dist;
    private Color color = new Color(000);
    private boolean fillok = false;
    Ho0127_01_Sub1(int xint yint x1, int y1, int dist, Color color, boolean fillok) {
        this.x = x;  this.x1 = x1;
        this.y = y;  this.y1 = y1;
        this.dist = dist;   this.color = color;
        this.fillok = fillok;
    }
    public int getX() {
      return x;
    }
    public int getY() {
      return y;
    }
    public int getX1() {
      return x1;
    }
    public int getY1() {
      return y1;
    }
    public int getDist() {
      return dist;
    }
    public Color getColor() {
      return color;
    }
    public boolean getFillOk() {
      return fillok;
    }
}

class Ho0127_01_Sub extends Frame implements MouseListenerMouseMotionListenerActionListenerItemListener {
    private Vector vc = new Vector();
    
    //Fram initialization용 Field
    private CheckboxGroup cgb1 = new CheckboxGroup();
    private Checkbox cb1 = new Checkbox("연필"true, cgb1);
    private Checkbox cb2 = new Checkbox("직선"false, cgb1);
    private Checkbox cb3 = new Checkbox("사각형"false, cgb1);
    private Checkbox cb4 = new Checkbox("원"false, cgb1); 
    
    //Menu용 Field
    private MenuBar mb = new MenuBar();
    private Menu file = new Menu("파일");
    private   MenuItem fnew = new MenuItem("New");
    private   MenuItem fopen = new MenuItem("Open");
    private   MenuItem fsave = new MenuItem("Save");
    private   MenuItem fexit = new MenuItem("Exit");
    private Menu tool = new Menu("도구");
    private Menu option = new Menu("옵션");
    private   MenuItem osetcolor = new MenuItem("색상");  
    private   CheckboxMenuItem ofill = new CheckboxMenuItem("채우기"false);
    private   CheckboxMenuItem ounfill = new CheckboxMenuItem("비우기"true);
    
    //색상 설정 다이얼 로그 박스 만들기
    private Dialog dlg = new Dialog(this"Color"true);
    private Label dlglb = new Label("red = "Label.RIGHT);
    private Label dlglb1 = new Label("green = "Label.RIGHT);
    private Label dlglb2 = new Label("blue = "Label.RIGHT);
    private TextField dlgtf = new TextField("0");
    private TextField dlgtf1 = new TextField("0");
    private TextField dlgtf2 = new TextField("0");
    private Button dlgbt = new Button("preview");
    private Button dlgbt1 = new Button("set");
    private Button dlgbt2 = new Button("cancel");
    
    //화면 크기 생성용
    private Toolkit tk = Toolkit.getDefaultToolkit();
    private Dimension di = tk.getScreenSize();
    
    private int xy, x1, y1;
    private Color color = new Color(0,0,0);
    //x = y = x1 = y1 = 0;

    private Ho0127_01_Sub_Can hsc = new Ho0127_01_Sub_Can(this);

    Ho0127_01_Sub(String str) {
        super(str);   
        this.setLayout(new BorderLayout());
        setSize(500400);      //Frame 크기 설정
        //Frame를 화면 정 중앙에 배치
        Dimension di1 = this.getSize();
        setLocation((int)(di.getWidth()/2-di1.getWidth()/2),
                    (int)(di.getHeight()/2-di1.getHeight()/2));
        init();
        start();

        setVisible(true);
    }
    //Frame의 초기화
    public void init() {
      this.setLayout(new BorderLayout(5,5));
        initMenu();        //메뉴 초기화
        initDlg();
        this.add("Center", hsc);
        Panel p1 = new Panel(new GridLayout(1,5));
        p1.setBackground(Color.green);
        p1.add(new Label());
        p1.add(cb1);
        p1.add(cb2);
        p1.add(cb3);
        p1.add(cb4);
        this.add("South", p1);
    }
    private void initDlg() {
        dlg.setLayout(new BorderLayout());
        dlg.setLocation(400,300);
        Panel p = new Panel(new GridLayout(31));
        p.add(dlglb);
        p.add(dlglb1);
        p.add(dlglb2);
        dlg.add("West", p);
        Panel p1 = new Panel(new GridLayout(31));
        p1.add(dlgtf);
        p1.add(dlgtf1);
        p1.add(dlgtf2);
        dlg.add("Center", p1);
        dlg.add("East", dlgbt);
        Panel p2 = new Panel(new FlowLayout(FlowLayout.RIGHT));
        p2.add(dlgbt1);
        p2.add(dlgbt2);
        dlg.add("South", p2);
        dlg.setSize(200150);
    }
    //Menu의 초기화 Method
    public void initMenu () {
        this.setMenuBar(mb);
        mb.add(file);
        file.add(fnew);
        file.addSeparator();
        file.add(fopen);
        file.add(fsave);
        file.addSeparator();
        file.add(fexit);
        mb.add(option);
        option.add(osetcolor);  
        option.addSeparator();
        option.add(ofill);
        option.add(ounfill);
    }
    
    public void start() {
        //창 닫기 버튼 누르면 실행
        this.addWindowListenernew WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(1);
            }
        });
        
        hsc.addMouseListenerthis );
        hsc.addMouseMotionListenerthis );
        
        //ActionListener 관련 이벤트 발생시
        fnew.addActionListenerthis );
        fopen.addActionListenerthis );
        fsave.addActionListenerthis );
        fexit.addActionListenerthis );
        osetcolor.addActionListenerthis );
        dlgbt.addActionListenerthis );
        dlgbt1.addActionListenerthis );
        dlgbt2.addActionListenerthis );
        
        //ItemListener 관련 이벤트 발생시
        ofill.addItemListenerthis );
        ounfill.addItemListenerthis );
    }
/*
    public void paint(Graphics g) {
        g.setColor(color);

        if(cb2.getState()) g.drawLine(xy, x1, y1);     //잔상 남기기..
        else if(ofill.getState()) {
            if (cb3.getState()) g.fillRect(xy, x1-x, y1-y);
            else if (cb4.getState()) g.fillOval(xy, x1-x, y1-y);    
        } else {
            if (cb3.getState()) g.drawRect(xy, x1-x, y1-y);
            else if (cb4.getState()) g.drawOval(xy, x1-x, y1-y);
        }
        
        for(int i=0; i < vc.size(); i++) {
            Ho0127_01_Sub1 imsi = (Ho0127_01_Sub1)vc.elementAt(i);
            g.setColor(imsi.getColor());
            switch(imsi.getDist()) {
                case 1:
                    g.drawLine(imsi.getX(), imsi.getY(), imsi.getX1(), imsi.getY1());
                    break;
                case 2:
                    if(imsi.getFillOk())  g.fillRect(imsi.getX(), imsi.getY(), imsi.getX1()-imsi.getX(), imsi.getY1()-imsi.getY());
                    else  g.drawRect(imsi.getX(), imsi.getY(), imsi.getX1()-imsi.getX(), imsi.getY1()-imsi.getY());
                    break;
                case 3:
                    if(imsi.getFillOk())  g.fillOval(imsi.getX(), imsi.getY(), imsi.getX1()-imsi.getX(), imsi.getY1()-imsi.getY());
                    else g.drawOval(imsi.getX(), imsi.getY(), imsi.getX1()-imsi.getX(), imsi.getY1()-imsi.getY());
                    break;
            }
        }
    }
    */
    public void mouseClicked(MouseEvent e) { }
    public void mouseEntered(MouseEvent e) { }
    public void mouseExited(MouseEvent e) { }
    public void mousePressed(MouseEvent e) {
    this.x = e.getX();
        this.y = e.getY();
    }
    public void mouseReleased(MouseEvent e) {
        this.x1 = e.getX();
        this.y1 = e.getY();
        int dist = 0;
        if(cb2.getState()) dist = 1;
        else if(cb3.getState()) dist = 2;
        else if(cb4.getState()) dist = 3;
        Ho0127_01_Sub1 hss = new Ho0127_01_Sub1(xy, x1, y1, dist, color, ofill.getState());
        vc.add(hss);
        hsc.repaint();
    }
    public void mouseMoved(MouseEvent e) { }
    public void mouseDragged(MouseEvent e) {
        if(cb1.getState()) {
            x1 = e.getX();
            y1 = e.getY();
            Ho0127_01_Sub1 hss = new Ho0127_01_Sub1(xy, x1, y1, 1, color, false);
            vc.add(hss);
            hsc.repaint();
            x = x1;
            y = y1;
        } else {
            x1 = e.getX();
            y1 = e.getY();
            hsc.repaint();
        }
    }

    public void actionPerformed(ActionEvent e) {
        if(e.getSource() == fnew) {
            vc.clear();
            x = y = x1 = y1 = 0;
            hsc.repaint();

        } else if(e.getSource() == fopen) {
          FileDialog fd = new FileDialog(this"열기"FileDialog.LOAD);
            fd.setVisible(true);

        } else if(e.getSource() == fsave) {
          FileDialog fd = new FileDialog(this"저장"FileDialog.SAVE);
            fd.setVisible(true);

        } else if(e.getSource() == fexit) {
          System.exit(1);

        } else if(e.getSource() == osetcolor) {
          dlg.setVisible(true);

        } else if(e.getSource() == dlgbt) {
            int r = Integer.parseInt(dlgtf.getText().trim());
            int g = Integer.parseInt(dlgtf1.getText().trim());
            int b = Integer.parseInt(dlgtf2.getText().trim());
            Color cc = new Color(r, g, b);
            dlgbt.setBackground(cc);

        } else if(e.getSource() == dlgbt1) {
            int r = Integer.parseInt(dlgtf.getText().trim());
            int g = Integer.parseInt(dlgtf1.getText().trim());
            int b = Integer.parseInt(dlgtf2.getText().trim());
            Color cc = new Color(r, g, b);
            color = cc;
            dlg.setVisible(false);
        }
        else if(e.getSource() == dlgbt2) {
            dlg.setVisible(false);
        }
    }

    //채우기나 비우기 둘 중 하나가 선택 되면 다른 하나의 채크된 것을 채크되지 않은 상태로
    public void itemStateChanged(ItemEvent e) {
      if(e.getSource() == ofill) {
            ofill.setState(true);
            ounfill.setState(false);

        } else if(e.getSource() == ounfill) {
            ofill.setState(false);
            ounfill.setState(true);
        }
    }

    public Color getColor() {
        return color;
    }
    public Vector getVc() {
        return vc;
    }
    public Checkbox getCb2() {
        return cb2;
    }
    public Checkbox getCb3() {
        return cb3;
    }
    public Checkbox getCb4() {
        return cb4;
    }
    public CheckboxMenuItem getOfill() {
        return ofill;
    }
    public int getX() {
        return x;
    }
    public int getX1() {
        return x1;
    }
    public int getY() {
        return y;
    }
    public int getY1() {
        return y1;
    }
}

class Ho0127_01_Sub_Can extends Canvas {
    Ho0127_01_Sub h1s = null;
    private int x, x1, y, y1;
    Ho0127_01_Sub_Can(Ho0127_01_Sub h1s) {
        this.h1s = h1s;
    }
    public void paint(Graphics g) {
        g.setColor(h1s.getColor());
        x = h1s.getX();  x1 = h1s.getX1();  y = h1s.getY();  y1 = h1s.getY1();
        if(h1s.getCb2().getState()) 
            g.drawLine(xy, x1, y1);     //잔상 남기기..
        else if(h1s.getOfill().getState()) {
            if (h1s.getCb3().getState()) g.fillRect(xy, x1-x, y1-y);
            else if(h1s.getCb4().getState()) g.fillOval(xy, x1-x, y1-y);    
        } else {
            if (h1s.getCb3().getState()) g.drawRect(xy, x1-x, y1-y);
            else if (h1s.getCb4().getState()) g.drawOval(xy, x1-x, y1-y);
        }

      for(int i=0; i < h1s.getVc().size(); i++) {
            Ho0127_01_Sub1 imsi = (Ho0127_01_Sub1)h1s.getVc().elementAt(i);
            g.setColor(imsi.getColor());
            switch(imsi.getDist()) {
                case 1:
                    g.drawLine(imsi.getX(), imsi.getY(), imsi.getX1(), imsi.getY1());
                    break;
                case 2:
                    if(imsi.getFillOk())  g.fillRect(imsi.getX(), imsi.getY(), imsi.getX1()-imsi.getX(), imsi.getY1()-imsi.getY());
                    else  g.drawRect(imsi.getX(), imsi.getY(), imsi.getX1()-imsi.getX(), imsi.getY1()-imsi.getY());
                    break;
                case 3:
                    if(imsi.getFillOk())  g.fillOval(imsi.getX(), imsi.getY(), imsi.getX1()-imsi.getX(), imsi.getY1()-imsi.getY());
                    else g.drawOval(imsi.getX(), imsi.getY(), imsi.getX1()-imsi.getX(), imsi.getY1()-imsi.getY());
                    break;
            }
        }
    }
}

//Main 객체 정의
public class Ho0127_01 {
    public static void main(String [] ar) {
        Ho0127_01_Sub h1s = new Ho0127_01_Sub("그림판");
    }
}