Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 7 của 7
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    giải thích liên kết giữa các class

    em có một class 1 ntn:
    Mã:
    import com.burdbrain.drawings.Drawing;
    import com.burdbrain.frames.ArtFrame;
    class ShowFrame {
    public static void main(String args[]) {
        ArtFrame artFrame = new ArtFrame(new Drawing());
        artFrame.setSize(200, 100);
        artFrame.setVisible(true);
    }
    }
    Và một class 2:
    Mã:
    package com.burdbrain.drawings;
    import java.awt.Graphics;
    publicclass Drawing {
         publicint x = 40, y = 40, width = 40, height = 40;
         public void paint(Graphics g) {
         g.drawOval(x, y, width, height);
    }
    }
    Em có một thắc mắc: class 1 gọi 1 instance của class 2 bằng cách new Drawing() thì làm sao có thể gọi đc method paint() của class 2? Trong khi binh thuong muon gọi thì phai nêu rõ ràng là
    Mã:
    Drawing drawing = new Drawing(); drawing.paint();
    Mong nhận được sự giải thích của các anh chị và các bạn, em xin cảm ơn! (Nếu từ câu hỏi trên mà cho thấy kiến thức của em còn chưa tới đâu thì cũng xin m.n thông cảm)

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Ý mình là tại sao ko gọi tới method draw() luôn mà ct lại biết thực thi method đó? Trong khi cách thông thường thì ít nhất mình cũng phải new Drawing().draw(), ý là ít nhất cũng phải nêu ra "àh t muốn thực thi draw()" .... trong ct trên thì draw() hoàn toàn ko bị kêu réo gì tới.

  3. #3
    Ngày tham gia
    Sep 2015
    Đang ở
    24 Rạch Bùng Binh , P10,Q3 , HCM
    Bài viết
    0
    Chưa hiểu ý bạn lắm. Theo mình hiểu ý của bạn là muốn khai báo và gọi method paint trong cùng câu lệnh luôn đúng không. Nếu muốn làm thế thì bạn thử cách sau:
    Bình thường thì chỉ việc:
    Mã:
    new Drawing().paint();
    Nếu muốn giữ lại cái biến của cái vừa khai báo để làm công việc xyz khác thì viết kiểu này:
    Mã:
    Drawing drawing = new Drawing(){{paint();}}
    drawing.xyz();

  4. #4
    Nếu như vậy thì bạn phải cho biết class com.burdbrain.frames.ArtFrame bên trong đó nó có gì.

  5. #5
    Trích dẫn Gửi bởi friendly_smile
    Ý mình là tại sao ko gọi tới method draw() luôn mà ct lại biết thực thi method đó? Trong khi cách thông thường thì ít nhất mình cũng phải new Drawing().draw(), ý là ít nhất cũng phải nêu ra "àh t muốn thực thi draw()" .... trong ct trên thì draw() hoàn toàn ko bị kêu réo gì tới.
    Có phải bạn muốn hỏi là tại sao trong constructor của class Drawing không đề cập tới method paint() mà khi khai báo ArtFrame artFrame = new ArtFrame(new Drawing()); mà nó vẫn được gọi chứ gì?
    Nếu câu hỏi là như vậy thì 2 cái class bạn đưa ra chưa đầy đủ và chính xác. Giả sử có:
    Mã:
    class ArtFrame extends JFrame{
         public ArtFrame(Drawing drawing){
              this.add(drawing);
         }
    }
    
    class Drawing extends JComponent{
         public int x = 40, y = 40, width = 40, height = 40;
         public void paint(Graphics g) {
              g.drawOval(x, y, width, height);
         }
    }
    
    class ShowFrame {
        public static void main(String args[]) {
            ArtFrame artFrame = new ArtFrame(new Drawing());
            artFrame.setSize(200, 100);
            artFrame.setVisible(true);
        }
    }
    Hàm paint() trong class Drawing là override của paint trong class Component. Hàm này được quản lý qua Event Dispatch Thread (EDT) (cái EDT này khởi động cùng JVM chạy ngầm phía sau kiểu như background process ấy). Mỗi khi bạn gọi hàm visible(true) của JFrame (hoặc khi detect được các event như window bị resize, thêm bớt các component, ....) thì EDT sẽ gọi hàm paint() của từng component trong JFrame đó.

    Đấy là lý do trong constructor của class Drawing không đề cập tới hàm paint() mà nó vẫn được gọi [IMG]images/smilies/2.gif[/IMG].

  6. #6
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    2 class đó chính xác là vậy đó bạn

  7. #7
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    Class 2 bạn viết trong package com.burdbrain.drawings.
    Vì vậy bạn có thể import và sử dụng package đó trong class 1.
    Trong class 1, package com.burdbrain.drawings kèm với class ArtFrame này ở đâu ra ? [IMG]images/smilies/waiting.gif[/IMG]
    Trong package đó không thấy class nào mang tên ArtFrame. Không có thì sao bạn có thể sử dụng được class ArtFrame.
    1. Project đó bạn viết thì share code class ArtFrame trong package com.burdbrain.drawings lên, thì mọi người mới có thể giúp được chứ.
    2. Nếu bạn tham khảo thì người ta share thiếu rồi đó. Hoặc là bạn tham khảo hay copy thiếu. Bạn có thể sử dụng netbean hay eclipse để test.

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •