- [Java 기본] Graphics
//===========================================================================//
본 내용은 2002년 제가 Java 강의를 수강하며 정리 했던 내용을
기본으로 하여 정리하였습니다.
- 마침 java 기초를 전파할 기회가 생겨 핑계김에 정리해 가려 합니다.
작성자 : litwave
//---------------------------------------------------------------------------//
<목차>
1. Graphics
생성자, Method, paint 실행 시기
//---------------------------------------------------------------------------//
*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 { } 에서 사용할 수 있는 것들.)
1) draw
a) drawLine(x, y, x1, y1); //전부 pixel의 값이다.
b) draw(fill)Rect(x, y, w, h); //draw속성과 fill속성을 둘다 가지고 있다. //사각형을 그리겠다.
c) draw(fill)Oval(x, y, w, h); //draw는 선을 그리고 fill은 -> 사용하면 안에 색이 칠해 진다. //원을 그리겠다.
- 여기서 그리는 원은 사각형에 내접하는 원이 그려 진다.
d) draw(fill)RoundRect(x, y, w, h, rx, ry);
- 모서리가 둥근 사각형이 그려진다.
e) draw(fill)Polygon(x[], y[], 개수);
- 다각형을 그릴 수 있다.
- x[], y[]는 꼭지점의 좌표들을 담고 있다.
-> 꼭지점의 순서대로 배열에 넣어 주면 된다.
2) String // 글자들은 특정 구역에 상관 없이 적어 줄 수 있다.
- drawString(string, x, y);
예) drawString("ggg", 100, 100); //여기서 좌표는.. 글자의 중간 쯤이다..
3) Image
객체발생 :
Image im = Toolkit.getDefaultToolkit().getImage("파일"); // 특정 파일로 부터 자바의 프로그램으로 불러 올 수 있다.
//Toolkit 객체 생성(외부와의 연동시 절대 경로명을 적어 주어야 한다. 리눅스: / , 윈도우: \\(역슬레시 두개를 사용해 주어야 한다.)
- drawImage(im, x, y, 표시화면) //특정 시작 점에서 부터 이미지의 크기대로 그려진다.
- drawImage(im, x, y, w, h, 표시화면)
4) 도형의 색 지정
- g.setColor(?)를 이용해서 특정 색상을 글자나 도형에 표시 할 수 있다.
- g.setColor(?)를 도형을 그리기 직전에 지정하면 그림은 그 바로 이전에 지정한 색상으로 그려진다.
3. paint가 실행되는 시기.
1) 생성자 실행시
2) resize 되는 순간에 update -> paint(--) 순으로 수행됨 (아이콘화 하는 것도 포함)
3) repaint() 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(100, 100, 150, 150);
g.setColor(Color.red);
g.drawRect(50, 50, 100, 100);
g.setColor(Color.blue);
g.drawOval(50, 50, 100, 100);
g.setColor(Color.green);
int[] x, y;
g.drawPolygon(x = new int[]{70, 120, 50}, y = new int[]{30, 100, 120}, 3);
g.drawImage(im, 150, 50, 100, 100, this);
}
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(300, 200);
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 = 100, y = 100;
public Ex0123_02_Sub1() {
im = Toolkit.getDefaultToolkit().getImage("aaa.gif");
}
public void paint(Graphics g) {
g.drawImage(im, 50, 50, x, y, this);
}
public void setXY(int x, int 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(400, 400);
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(200, 200);
} else if(e.getSource() == bt1) {//축소...
bt1.setEnabled(false);
bt.setEnabled(true);
bt.requestFocus();
ess.setXY(100, 100);
}
}
}
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 x, y, w, h;
public void setXYWH(int x, int y, int w, int h) {
this.x = x; this.y = y;
this.w = w; this.h = h;
this.repaint();
}
public void paint(Graphics g) {
g.drawRect(x, y, w, h);
g.drawOval(x, y, 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(300, 200);
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(4, 1));
Panel p1 = new Panel(new GridLayout(4, 1));
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(200, 140);
}
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(x, y, 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 x, y, x1, y1, dist;
private Color color = new Color(0, 0, 0);
private boolean fillok = false;
Ho0127_01_Sub1(int x, int y, int 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 MouseListener, MouseMotionListener, ActionListener, ItemListener {
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 x, y, 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(500, 400); //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(3, 1));
p.add(dlglb);
p.add(dlglb1);
p.add(dlglb2);
dlg.add("West", p);
Panel p1 = new Panel(new GridLayout(3, 1));
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(200, 150);
}
//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.addWindowListener( new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(1);
}
});
hsc.addMouseListener( this );
hsc.addMouseMotionListener( this );
//ActionListener 관련 이벤트 발생시
fnew.addActionListener( this );
fopen.addActionListener( this );
fsave.addActionListener( this );
fexit.addActionListener( this );
osetcolor.addActionListener( this );
dlgbt.addActionListener( this );
dlgbt1.addActionListener( this );
dlgbt2.addActionListener( this );
//ItemListener 관련 이벤트 발생시
ofill.addItemListener( this );
ounfill.addItemListener( this );
}
/*
public void paint(Graphics g) {
g.setColor(color);
if(cb2.getState()) g.drawLine(x, y, x1, y1); //잔상 남기기..
else if(ofill.getState()) {
if (cb3.getState()) g.fillRect(x, y, x1-x, y1-y);
else if (cb4.getState()) g.fillOval(x, y, x1-x, y1-y);
} else {
if (cb3.getState()) g.drawRect(x, y, x1-x, y1-y);
else if (cb4.getState()) g.drawOval(x, y, 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(x, y, 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(x, y, 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(x, y, x1, y1); //잔상 남기기..
else if(h1s.getOfill().getState()) {
if (h1s.getCb3().getState()) g.fillRect(x, y, x1-x, y1-y);
else if(h1s.getCb4().getState()) g.fillOval(x, y, x1-x, y1-y);
} else {
if (h1s.getCb3().getState()) g.drawRect(x, y, x1-x, y1-y);
else if (h1s.getCb4().getState()) g.drawOval(x, y, 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("그림판");
}
}
'scrap > Java/JSP' 카테고리의 다른 글
- [Java 기본]Thread, synchronized, 압축 및 배포 (1) | 2011.05.14 |
---|---|
- [Java 기본] Applet (0) | 2011.05.14 |
- [Java 기본]AWT, Listener, Event (0) | 2011.05.14 |
- [Java 기본]Menu, Frame 정렬, FileDialog, Dialog, Event (0) | 2011.05.14 |
- [Java 기본] AWT - Panel, Label, Button, Checkbox, Choice, List, TextField, TextArea (0) | 2011.05.14 |