Xin các pác cho hỏi hàm về g.dispose()

Thảo luận trong 'Lập trình & Đồ hoạ' bắt đầu bởi laylayzi, 8/11/12.

  1. laylayzi

    laylayzi Mario & Luigi

    Tham gia ngày:
    22/11/08
    Bài viết:
    741
    số là hôm nay ông thầy có cho 1 đoạn code "trái banh chạy trên màn hình" bảo về nhà tự đọc tự tìm hiểu và ổng ko giải thích gì thêm
    cái chính là xem và hiểu cách làm việc của multithread

    đây là lần đầu em gặp code java, trước đây chưa từng học về cái này
    nên săn tiện muốn tìm hiểu thêm tí

    về đoạn code dưới đây em cũng hiểu đc sơ sơ
    duy chỉ có cái hàm g.dispose() ko hiểu để làm gì

    pác nào giải thích giúp em, em xin cám ơn & nếu đc thì giải thích nguyên đoạn code giùm em xem cái "sơ sơ" của em hiểu đc có chính xác ko

    cám ơn máy pác nhiều :4cool_beauty:

    Mã:
    import java.awt.*;
    import javax.swing.*;
    public class Balls extends Thread{
        private JPanel box;
        private static final int XSIZE=10;
        private static final int YSIZE=10;
        private int x=0;
        private int y=0;
        private int dx=2;
        private int dy=2;
        public Balls(JPanel p){
            box=p;
        }
        public void draw(){
            Graphics g=box.getGraphics();
            g.fillOval(x,y,XSIZE,YSIZE);
            g.dispose();
        }
        public void move(){
            Graphics g=box.getGraphics();
            g.setXORMode(Color.GREEN);
            g.fillOval(x,y,XSIZE,YSIZE);
            x+=dx;
            y+=dy;
            Dimension d=box.getSize();
            if(x<0){
                x=0;
                dx=-dx;
            }
            if(x+XSIZE>=d.getWidth()){
                x=d.width-XSIZE;
                dx=-dx;
            }
            if(y<0){
                y=0;
                dy=-dy;
            }
            if(y+YSIZE>=d.getHeight()){
                y=d.height-YSIZE;
                dy=-dy;
            }
            g.fillOval(x,y,XSIZE,YSIZE);
            g.dispose();
        }
        public void run(){
            draw();
            for(int i=0; i<5000; i++){
                move();
                try{
                    sleep(10);
                }catch(InterruptedException ex){
                    JOptionPane.showMessageDialog(null,ex.toString(),"Thong Bao Loi",JOptionPane.ERROR_MESSAGE);
                }
            }
        }
    }
     
  2. Burmy

    Burmy C O N T R A Lão Làng GVN

    Tham gia ngày:
    16/9/09
    Bài viết:
    1,656
    dispose để ngắt tiến trình đó bạn, cụ thể là ngắt tiến trình của đối tượng g !!!!!!
     
  3. Zhihu

    Zhihu Space Marine Doomguy Lão Làng GVN

    Tham gia ngày:
    13/6/06
    Bài viết:
    5,542
    Nơi ở:
    The Earth
    Nhầm rồi, bạn để ý là trong vòng lặp for(5000) phương thức move() được gọi 5000 lần, mỗi lần gọi biến tham chiếu g lại được khởi tạo Graphics g=box.getGraphics(), nếu cứ để nó tạo tự do quá nhiều biến thì sẽ dẫn đến tràn bộ nhớ, nếu chỉ trông cậy vào tiến trình dọn rác của Java không thì không đáng tin lắm, thông thường một lập trình viên có kinh nghiệm sẽ giải phóng bộ nhớ thủ công luôn mà không đợi đến lúc trình dọn rác làm việc, phương thức dispose() ở đây chính là để giải phóng bộ nhớ cho biến g.

    Với máy móc như hiện nay thì dù bạn có bỏ dòng code đó đi thì chạy cũng chẳng thấy có khác biệt gì, nhưng cứ thử bỏ dispose(), bỏ sleep(), tăng vòng lặp lên 1 tỉ xem sao, mình ko thử nhưng đoán là sẽ treo :))
     

Chia sẻ trang này