본문 바로가기

카테고리 없음

AWT 그래픽과 이미지

그래픽 실행 순서와 호출법

  • 실행순서
    1. Frame을 상속받은 클래스의 객체 생성
    2. public void update(Graphics g) { paint(g); }  호출
    3. public void paint(Graphics g) {} 호출
    4. Frame Open
    5. 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){
    
    }
}

 

  • 호출 방법
    1. Frame Open
    2. Resizable
    3. 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();
    }
}