그래픽 실행 순서와 호출법
- 실행순서
- Frame을 상속받은 클래스의 객체 생성
- public void update(Graphics g) { paint(g); } 호출
- public void paint(Graphics g) {} 호출
- Frame Open
- Thread 대기 상태
기본형태
class _Sub extends Frame {
public _Sub() {
super("제목");
this.init();
this.start();
this.setSize(300, 200);
this.setVisible(true);
}
public void init() {
}
public void start() {
}
public void update(Graphics g) {
paint(g);
}
public void paint(Graphics g){
}
}
- 호출 방법
- Frame Open
- Resizable
- call repaint()
Graphics 클래스와 메서드
메서드 요약
메서드 | 설명 |
clearRect(int a, int b, int c, int d) | 점(a, b)에서 폭 c, 높이 d로 표현되는 사각형 영역을 지운다. |
drawImage(Image a, int b, int c, ImageObserver d) | Image a를 점(b, c)를 시작점으로 ImageObserver d에 출력한다. |
drawImage(Image a, int b, int c, int d, int e, ImageObserver f) | mage a를 점(b, c)를 시작점으로 하고 폭 d, 높이 e를 가지는 크기로 ImageObserver f에 출력한다. |
drawLine(int a, int b, int c, int d) | 시작점(a, b)에서 끝점(c, d)까지 직선을 출력한다. |
drawOval(int a, int b, int c, int d) | 점(a, b)에서 폭 c를 가지고 높이 d를 가지는 사각형에 내접하는 타원을 출력한다. |
drawPolygon(int[] a, int[] b, int c) | a배열을 x축에 대한 좌포들로, b배열을 y축에 대한 좌표들로 c개수만큼의 꼭지점을 가지는 다각형을 출력한다. |
drawRect(int a, int b, int c, int d) | 점(a, b)에서 폭 c를 가지고 높이 d를 가지는 사각형을 출력한다. |
drawString(String str, int a, int b) | 문자열 str을 점(a, b)를 시작점으로 출력한다. |
fillOval, fillRect, fillPolygon 등 | 그래픽 내용부가 채워진다는 차이점을 제외하고는 drawXXX 내용과 일치한다. |
setColor(Color a) | 출력되는 그래픽의 색상을 a 색상으로 조정한다. |
setFont(Font a) | 출력되는 그래픽 문자열의 폰트를 조정한다. |
class Round20_Ex01_Sub extends Frame {
private Button bt = new Button("확인");
private Button bt1 = new Button("취소");
public Round20_Ex01_Sub(){
super("Test");
this.init();
this.start();
this.setSize(500, 500);
this.setVisible(true);
}
public void init() {
this.setLayout(new BorderLayout());
Panel p = new Panel(new FlowLayout());
p.add(bt);
p.add(bt1);
this.add("North",p);
}
public void start() {
}
/*
처음 프레임이 출력될 때 자동으로 초기화가 일어남
public void update(Graphics g) {
paint(g);
}
*/
public void paint(Graphics g) {
// 시작점(100, 100), 끝점 (200, 200)
g.drawLine(100, 100, 200, 200);
// 점(100, 100) 폭 100, 높이 100, round_x : 30, round_y : 30
g.drawRect(100, 100, 100, 100, 30, 30);
//x 좌표 꼭지점 순서
int[] x = {250, 300, 200};
//y 좌표 꼭지점 순서
int[] y = {200, 300, 300};
//삼각형 출력
g.drawPolygon(x, y, x.length);
g.setColor(Color.red);
//점(200, 100) 폭: 100, 높이: 100 채워진 타원출력
g.fillOval(200, 100, 100, 100);
}
}
public class Round20_Ex01 {
public static void main(String[] ar) {
new Round20_Ex01_Sub();
}
}
랜덤으로 여러개의 도형 그리기
....
public void paint(Graphics g) {
for(int i=0; i < 1000; i++) {
int red = (int)(Math.random() * 256);
int green = (int)(Math.random() * 256);
int blue = (int)(Math.random() * 256);
g.setColor(new Color(red, green, blue));
Dimension di = this.getSize();
int x = (int)(Math.random() * di.getWidth());
int y = (int)(Math.random() * di.getHeight());
int w = (int)(Math.random() * 50) + 50;
int h = (int)(Math.random() * 50) + 50;
int dist = (int)(Math.random() * 4);
//도형선택
if( dist == 0 ) g.drawRect(x, y, w, h);
else if( dist == 1 ) g.fillRect(x, y, w, h);
else if( dist == 2 ) g.drawOval(x, y, w, h);
else g.fillOval(x, y, w, h);
//도형선택
try { Thread.sleep(100); } catch( InterruptedException e) {}
}
}
....
프레임에 이미지와 문자열을 사용하는 예제
import java.awt.*;
import java.awt.event.*;
import java.util.*;
class Round20_Ex03_Sub extends Frame {
private Image img;
public Round20_Ex03_Sub() {
super("제목");
this.init();
this.start();
this.setSize(500, 500);
this.setVisible(true);
while(true) {
try { Thread.sleep(1000); } catch( InterruptedException e) {}
this.repaint();
}
}
public void init() {
img = Toolkit.getDefaultToolkit().getImage("c:\\aaa.gif");
}
public void start() {
}
/*
public void update(Graphics g) {
paint(g);
}
*/
public void paint(Graphics g){
String date = new Date().toString();
d.drawString(date, 50, 50);
g.drawImage(img, 50, 100, 300, 300, this);
}
}
public class Round20_Ex03 {
public static void main(String[] args) {
new Round20_Ex03_Sub();
}
}
이미지 확대 축소
import java.awt.*;
import java.awt.event.*;
import java.util.*;
class Round20_Ex04_Sub extends Frame implements ActionListener {
private Button bt = new Button("확대");
private Button bt1 = new Button("축소");
private Image img;
private int w = 100, h = 100;
public Round20_Ex04_Sub() {
super("Test");
this.init();
this.start();
this.setSize(300, 300);
this.setVisible(true);
}
public void init() {
img = Toolkit.getDefaultToolkit().getImage("c:\\aaa.gif");
this.setLayout(new BorderLayout());
Panel p = new Panel(new FlowLayuout(FlowLayout.RIGHT));
p.add(bt);
bt.setEnabled(false);
p.add(bt1);
this.add("North",p);
}
public void start() {
bt.addActionListener(this);
bt1.addActionListener(this);
}
/*
public void update(Graphics g) {
paint(g);
}
*/
public void paint(Graphics g){
g.drawImage(img, 50, 80, x, y, this);
}
public void actionPerformed(ActionEvent e) {
if( e.getSource() == bt ) {
bt.setEnabled(false);
bt1.setEnabled(true);
bt1.requestFocus();
w = h = 200;
this.repaint();
} else if ( e.getSource() == bt1 ) {
bt1.setEnabled(false);
bt.setEnabled(true);
bt.requestFocus();
w = h = 100;
this.repaint();
}
}
}
public class Round20_Ex03 {
public static void main(String[] args) {
new Round20_Ex03_Sub();
}
}
그래픽을 이용한 그림판 예제
DrawInfo 클래스
public class DrawInfo implements Serializable {
private int x;
private int x1;
private int y;
private int y1;
private Color color;
private boolean fill;
public Drawinfo(int x, int y, int x1, int y1, Color color, boolean fill) {
this.x = x;
this.y = y;
this.x1 = x1;
this.y1 = y1;
this.color = color;
this.fill = fill;
}
.... get set 함수들 ...
}
Round10_Ex05_Sub 클래스
class Round10_Ex05_Sub extends Frame
implements MouseListener, MouseMotionListener, ItemListener, ActionListener {
private MenuBar mb = new MenuBar();
private List<Menu> mm = Arrays.asList(
new Menu("FILE")
, new Menu("OPTION")
);
private List<MenuItem> fileMi = Arrays.asList(
new MenuItem("NEW")
, new MenuItem("OPEN")
, new MenuItem("SAVE")
, new MenuItem("EXIT")
);
private List<Menu> optionM = Arrays.asList(
new Menu("DRAW")
, new Menu("COLOR")
, new Menu("PROPERTY")
);
private List<CheckboxMenuItem> drawCmi = Arrays.asList(
new CheckboxMenuItem("OPEN",true)
, new CheckboxMenuItem("LINE")
, new CheckboxMenuItem("RECT")
, new CheckboxMenuItem("CIRCLE")
);
private List<CheckboxMenuItem> colorCmi = Arrays.asList(
new CheckboxMenuItem("RED")
, new CheckboxMenuItem("BLUE")
, new CheckboxMenuItem("GREEN")
);
private List<CheckboxMenuItem> propCmi = Arrays.asList(
new CheckboxMenuItem("DRAW", true)
, new CheckboxMenuItem("FILL")
);
private int x, y, x1, y1, dist;
private Color color;
private boolean fill;
private Vector vc = new Vector;
public Round10_Ex05_Sub () {
super("그림판");
this.init();
this.start();
this.setSize(500, 500);
this.setVisible(true);
}
public void init() {
this.setMenuBar(mb);
for(Menu m : mm) {
this.add(m);
}
//파일
for(int i=0; i<fileMi.size(); i++){
mm.get(0).add(fileMi.get(i));
if( i == 0 || i == 2){
mm.get(0).addSeparator();
}
}
// 옵션
for(int i=0; i<optionM.size(); i++){
mm.get(1).add(optionM.get(i));
if( i == 0 || i == 1){
mm.get(1).addSeparator();
}
}
// 그림
for( CheckboxMenuItem cmi : drawCmi){
optionM.get(0).add(cmi);
}
// 색상
for( CheckboxMenuItem cmi : colorCmi){
optionM.get(1).add(cmi);
}
// 속성
for( CheckboxMenuItem cmi : propCmi){
optionM.get(2).add(cmi);
}
}
public void start() {
this.addMouseListener(this);
this.addMouseMotionListener(this);
for(CheckboxMenuItem cmi : drawCmi) {
cmi.addItemListener(this);
}
for(CheckboxMenuItem cmi : propCmi) {
cmi.addItemListener(this);
}
for(MenuItem mi : fileMi) {
mi.addActionListener(this);
}
}
/*
public void update(Graphics g) {
paint(g);
}
*/
public void paint(Graphics g){
g.setColor(new Color(
colorCmi.get(0).getState() ? 255 : 0
, colorCmi.get(2).getState() ? 255 : 0
, colorCmi.get(1).getState() ? 255 : 0
));
if(dist == 1 || dist == 0) {
d.drawLine(x, y, x1, y1);
} else if(dist == 2) {
fill ? g.fillRect(x, y, x1-x, y1-y) : g.drawRect(x, y, x1-x, y1-y);
} else if(dise == 3) {
fill ? g.fillOval(x, y, x1-x, y1-y) : g.drawOval(x, y, x1-x, y1-y);
}
for(int i=0; i<vc.size(); i++) {
DrawInfo imsi = (DrawInfo) vc.elementAt(i);
if( imsi.getType() == 1 || imsi.getType() == 0 ) {
g.drawLine(imsi.getX(), imsi.getY(), imsi.getX1(), imsi.getY1());
} else if( imsi.getType() == 2 ) {
imsi.getFill()
? g.fillRect(imsi.getX(), imsi.getY(), imsi.getX1()-imsi.getX(), imsi.getY1()-imsi.getY())
: g.drawRect(imsi.getX(), imsi.getY(), imsi.getX1()-imsi.getX(), imsi.getY1()-imsi.getY());
} else if( imsi.getType() == 3 ) {
imsi.getFill()
? g.fillOval(imsi.getX(), imsi.getY(), imsi.getX1()-imsi.getX(), imsi.getY1()-imsi.getY())
: g.drawOval(imsi.getX(), imsi.getY(), imsi.getX1()-imsi.getX(), imsi.getY1()-imsi.getY());
}
}
}
public void mouseClicked(MouseEvent e) {}
public void mousePressed(MouseEvent e) {
x = e.getX();
y = e.getY();
}
public void mouseReleased(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
vc.add(new DrawInfo(
x
, y
, x1
, y1
, dist
, new Color(
colorCmi.get(0).getState() ? 255 : 0
, colorCmi.get(2).getState() ? 255 : 0
, colorCmi.get(1).getState() ? 255 : 0
)
, propCmi.get(1).getState()
));
this.repaint();
}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseMoved(MouseEvent e) {}
public void mouseDragged(MouseEvent e) {
x1 = e.getX();
y1 = e.getY();
if(dist == 0 ) {
vc.add(new DrawInfo(
x
, y
, x1
, y1
, dist
, new Color(
colorCmi.get(0).getState() ? 255 : 0
, colorCmi.get(2).getState() ? 255 : 0
, colorCmi.get(1).getState() ? 255 : 0
)
, propCmi.get(1).getState()
));
x = x1;
y = y1;
}
this.repaint();
}
public void itemStateChanged(ItemEvent e) {
if( e.getSource() == drawCmi.get(0) ) {
itemStateChangedSet(0);
}
else if( e.getSource() == drawCmi.get(1) ) {
itemStateChangedSet(1);
}
else if( e.getSource() == drawCmi.get(2) ) {
itemStateChangedSet(2);
}
else if( e.getSource() == drawCmi.get(3) ) {
itemStateChangedSet(3);
}
else if( e.getSource() == propCmi.get(0) ) {
propCmi.get(0).setState(true);
propCmi.get(1).setState(false);
}
else if( e.getSource() == propCmi.get(1) ) {
propCmi.get(0).setState(false);
propCmi.get(1).setState(true);
}
}
private void itemStateChangedSet(int distance) {
this.dist = distance;
for(int i=0; i<drawCmi.size(); i++) {
drawCmi.get(i).setState( this.dist == i );
}
}
public void actionPerformed(ActionEvent e) {
if( e.getSource() == fileMi.get(0) )
{ //새파일
vc.clear();
x = y = x1 = y1 = dist = 0;
this.repaint();
}
else if ( e.getSource() == fileMi.get(1) )
{ // 열기
FileDialog fdlg = new FileDialog(this, "열기", FileDialog.LOAD);
fdlg.setVisible(true);
String dir = fdlg.getDirectory();
String file = fdlg.getFile();
if( dir == null || file == null) return;
try {
ObjectInputStream oos = new ObjectInputStream(
new BufferedInputStream(
new FileInputStream(new File(dir, file))
)));
vc = (Vector)oos.readObject();
oos.close();
} catch(IOException ioe) {
} catch(ClassNotFoundException e) {
}
}
else if ( e.getSource() == fileMi.get(2) )
{ // 저장
FileDialog fdlg = new FileDialog(this, "저장", FileDialog.SAVE);
fdlg.setVisible(true);
String dir = fdlg.getDirectory();
String file = fdlg.getFile();
if( dir == null || file == null) return;
try {
ObjectOutputStream oos = new ObjectOutputStream(
new BufferedOutputStream(
new FileOutputStream(new File(dir, file))
)));
oos.writeObject(vc);
oos.close();
} catch(IOException ioe) {
}
}
else if ( e.getSource() == fileMi.get(2) )
{ // 나가기
System.exit(0);
}
}
}
public class Round20_Ex05 {
public static void main(String[] args) {
new Round20_Ex05_Sub();
}
}